From f2b994774fbe5f8b4e6f1d0f8a2bcd3f4c15adf4 Mon Sep 17 00:00:00 2001 From: Gaurav Ujjwal Date: Wed, 17 May 2023 09:56:05 +0530 Subject: [PATCH] Fix Option key not working in macOS Alt key is used to invoke the Option key in macOS. But instead of XK_Alt, the server expects XK_Meta keysym. Re: #163 --- app/src/main/cpp/native-vnc.cpp | 6 ++++++ app/src/main/java/com/gaurav/avnc/vnc/VncClient.kt | 10 ++++++++++ extern/libvncserver | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/cpp/native-vnc.cpp b/app/src/main/cpp/native-vnc.cpp index edbf77b6..a7970c85 100644 --- a/app/src/main/cpp/native-vnc.cpp +++ b/app/src/main/cpp/native-vnc.cpp @@ -320,6 +320,12 @@ Java_com_gaurav_avnc_vnc_VncClient_nativeInit(JNIEnv *env, jobject thiz, jlong c return JNI_FALSE; } +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_gaurav_avnc_vnc_VncClient_nativeIsServerMacOS(JNIEnv *env, jobject thiz, jlong client_ptr) { + auto client = (rfbClient *) client_ptr; + return client->serverMajor == 3 && client->serverMinor == 889; +} extern "C" JNIEXPORT void JNICALL diff --git a/app/src/main/java/com/gaurav/avnc/vnc/VncClient.kt b/app/src/main/java/com/gaurav/avnc/vnc/VncClient.kt index 92e464f4..f16d985a 100644 --- a/app/src/main/java/com/gaurav/avnc/vnc/VncClient.kt +++ b/app/src/main/java/com/gaurav/avnc/vnc/VncClient.kt @@ -1,5 +1,6 @@ package com.gaurav.avnc.vnc +import android.view.KeyEvent import androidx.annotation.Keep import java.io.IOException import java.nio.ByteBuffer @@ -124,6 +125,7 @@ class VncClient(private val observer: Observer) { fun connect(host: String, port: Int) { connected = nativeInit(nativePtr, host, port) if (!connected) throw IOException(nativeGetLastErrorStr()) + applyCompatQuirks() } /** @@ -252,6 +254,13 @@ class VncClient(private val observer: Observer) { block() } + private fun applyCompatQuirks() { + if (nativeIsServerMacOS(nativePtr)) { + XKeySymAndroid.updateKeyMap(KeyEvent.KEYCODE_ALT_LEFT, XKeySym.XK_Meta_L) + XKeySymAndroid.updateKeyMap(KeyEvent.KEYCODE_ALT_RIGHT, XKeySym.XK_Meta_R) + } + } + private external fun nativeClientCreate(): Long private external fun nativeConfigure(clientPtr: Long, securityType: Int, useLocalCursor: Boolean, imageQuality: Int, useRawEncoding: Boolean) private external fun nativeInit(clientPtr: Long, host: String, port: Int): Boolean @@ -270,6 +279,7 @@ class VncClient(private val observer: Observer) { private external fun nativeUploadFrameTexture(clientPtr: Long) private external fun nativeUploadCursor(clientPtr: Long, px: Int, py: Int) private external fun nativeGetLastErrorStr(): String + private external fun nativeIsServerMacOS(clientPtr: Long): Boolean private external fun nativeCleanup(clientPtr: Long) @Keep diff --git a/extern/libvncserver b/extern/libvncserver index ea809211..62a7f931 160000 --- a/extern/libvncserver +++ b/extern/libvncserver @@ -1 +1 @@ -Subproject commit ea809211332c435877fd1a3a2de1d8c4fefb4d5b +Subproject commit 62a7f9316f6f01c7c9ca0d920737b75e9972012c