From 91dd7b7049fa605ce8f9ca0e946cdedb1c11db14 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 20 Feb 2023 19:52:33 -0600 Subject: [PATCH] Plumb non-normalized key flag extension for Sunshine --- app/src/main/java/com/limelight/Game.java | 10 ++++++---- .../binding/input/KeyboardTranslator.java | 16 ++++++++++++++++ .../com/limelight/nvstream/NvConnection.java | 4 ++-- .../com/limelight/nvstream/jni/MoonBridge.java | 4 +++- app/src/main/jni/moonlight-core/simplejni.c | 4 ++-- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index e1d6c647..6d3f8a0d 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -1324,7 +1324,8 @@ public class Game extends Activity implements SurfaceHolder.Callback, if (KeyboardTranslator.needsShift(event.getKeyCode())) { modifiers |= KeyboardPacket.MODIFIER_SHIFT; } - conn.sendKeyboardInput(translated, KeyboardPacket.KEY_DOWN, modifiers); + conn.sendKeyboardInput(translated, KeyboardPacket.KEY_DOWN, modifiers, + keyboardTranslator.hasNormalizedMapping(event.getKeyCode(), event.getDeviceId()) ? 0 : MoonBridge.SS_KBE_FLAG_NON_NORMALIZED); } return true; @@ -1388,7 +1389,8 @@ public class Game extends Activity implements SurfaceHolder.Callback, if (KeyboardTranslator.needsShift(event.getKeyCode())) { modifiers |= KeyboardPacket.MODIFIER_SHIFT; } - conn.sendKeyboardInput(translated, KeyboardPacket.KEY_UP, modifiers); + conn.sendKeyboardInput(translated, KeyboardPacket.KEY_UP, modifiers, + keyboardTranslator.hasNormalizedMapping(event.getKeyCode(), event.getDeviceId()) ? 0 : MoonBridge.SS_KBE_FLAG_NON_NORMALIZED); } return true; @@ -2199,10 +2201,10 @@ public class Game extends Activity implements SurfaceHolder.Callback, } if (buttonDown) { - conn.sendKeyboardInput(keyMap, KeyboardPacket.KEY_DOWN, getModifierState()); + conn.sendKeyboardInput(keyMap, KeyboardPacket.KEY_DOWN, getModifierState(), (byte)0); } else { - conn.sendKeyboardInput(keyMap, KeyboardPacket.KEY_UP, getModifierState()); + conn.sendKeyboardInput(keyMap, KeyboardPacket.KEY_UP, getModifierState(), (byte)0); } } } diff --git a/app/src/main/java/com/limelight/binding/input/KeyboardTranslator.java b/app/src/main/java/com/limelight/binding/input/KeyboardTranslator.java index 8ccda4dd..c15eb3dc 100644 --- a/app/src/main/java/com/limelight/binding/input/KeyboardTranslator.java +++ b/app/src/main/java/com/limelight/binding/input/KeyboardTranslator.java @@ -118,6 +118,22 @@ public class KeyboardTranslator implements InputManager.InputDeviceListener { } } + public boolean hasNormalizedMapping(int keycode, int deviceId) { + if (deviceId >= 0) { + KeyboardMapping mapping = keyboardMappings.get(deviceId); + if (mapping != null) { + // Try to map this device-specific keycode onto a QWERTY layout. + // GFE assumes incoming keycodes are from a QWERTY keyboard. + int qwertyKeyCode = mapping.getQwertyKeyCodeForDeviceKeyCode(keycode); + if (qwertyKeyCode != KeyEvent.KEYCODE_UNKNOWN) { + return true; + } + } + } + + return false; + } + /** * Translates the given keycode and returns the GFE keycode * @param keycode the code to be translated diff --git a/app/src/main/java/com/limelight/nvstream/NvConnection.java b/app/src/main/java/com/limelight/nvstream/NvConnection.java index cc084bde..ed94b510 100644 --- a/app/src/main/java/com/limelight/nvstream/NvConnection.java +++ b/app/src/main/java/com/limelight/nvstream/NvConnection.java @@ -505,9 +505,9 @@ public class NvConnection { } } - public void sendKeyboardInput(final short keyMap, final byte keyDirection, final byte modifier) { + public void sendKeyboardInput(final short keyMap, final byte keyDirection, final byte modifier, final byte flags) { if (!isMonkey) { - MoonBridge.sendKeyboardInput(keyMap, keyDirection, modifier); + MoonBridge.sendKeyboardInput(keyMap, keyDirection, modifier, flags); } } diff --git a/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java b/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java index cb1eeba0..1f4850e3 100644 --- a/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java +++ b/app/src/main/java/com/limelight/nvstream/jni/MoonBridge.java @@ -73,6 +73,8 @@ public class MoonBridge { public static final int ML_TEST_RESULT_INCONCLUSIVE = 0xFFFFFFFF; + public static final byte SS_KBE_FLAG_NON_NORMALIZED = 0x01; + private static AudioRenderer audioRenderer; private static VideoDecoderRenderer videoRenderer; private static NvConnectionListener connectionListener; @@ -305,9 +307,9 @@ public class MoonBridge { short leftStickX, short leftStickY, short rightStickX, short rightStickY); - public static native void sendKeyboardInput(short keyMap, byte keyDirection, byte modifier); public static native void sendMouseScroll(byte scrollClicks); + public static native void sendKeyboardInput(short keyMap, byte keyDirection, byte modifier, byte flags); public static native void sendMouseHighResScroll(short scrollAmount); diff --git a/app/src/main/jni/moonlight-core/simplejni.c b/app/src/main/jni/moonlight-core/simplejni.c index 0c37298e..1c579fce 100644 --- a/app/src/main/jni/moonlight-core/simplejni.c +++ b/app/src/main/jni/moonlight-core/simplejni.c @@ -47,8 +47,8 @@ Java_com_limelight_nvstream_jni_MoonBridge_sendControllerInput(JNIEnv *env, jcla } JNIEXPORT void JNICALL -Java_com_limelight_nvstream_jni_MoonBridge_sendKeyboardInput(JNIEnv *env, jclass clazz, jshort keyCode, jbyte keyAction, jbyte modifiers) { - LiSendKeyboardEvent(keyCode, keyAction, modifiers); +Java_com_limelight_nvstream_jni_MoonBridge_sendKeyboardInput(JNIEnv *env, jclass clazz, jshort keyCode, jbyte keyAction, jbyte modifiers, jbyte flags) { + LiSendKeyboardEvent2(keyCode, keyAction, modifiers, flags); } JNIEXPORT void JNICALL