From 8f164096603832c7eb9bcddca0a645ca7f3b11cc Mon Sep 17 00:00:00 2001 From: downthecrop Date: Sun, 17 Dec 2023 01:34:13 -0800 Subject: [PATCH] Keycode 67 handling --- .../keyboard/TouchCharInput.java | 5 +- .../net/kdt/pojavlaunch/utils/KeyEncoder.java | 148 ++++++------------ 2 files changed, 54 insertions(+), 99 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/keyboard/TouchCharInput.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/keyboard/TouchCharInput.java index 8011684c25..f9b14b3008 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/keyboard/TouchCharInput.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/keyboard/TouchCharInput.java @@ -23,6 +23,7 @@ */ public class TouchCharInput extends androidx.appcompat.widget.AppCompatEditText { public static final String TEXT_FILLER = " "; + public static boolean softKeyboardIsActive = false; public TouchCharInput(@NonNull Context context) { this(context, null); } @@ -49,7 +50,7 @@ protected void onTextChanged(CharSequence text, int start, int lengthBefore, int Log.i("TouchCharInput","New Event (before/after)!: "+ lengthBefore + " : " + lengthAfter); boolean isBackSpace = (lengthBefore > lengthAfter); if(isBackSpace) { - KeyEncoder.sendEncodedChar(KeyEncoder.backspaceUnicode,KeyEncoder.backspaceUnicode); + KeyEncoder.sendUnicodeBackspace(); return; } char c = text.charAt(text.length()-1); @@ -115,6 +116,7 @@ public void clear(){ /** Regain ability to exist, take focus and have some text being input */ public void enable(){ + softKeyboardIsActive = true; setEnabled(true); setFocusable(true); setVisibility(VISIBLE); @@ -123,6 +125,7 @@ public void enable(){ /** Lose ability to exist, take focus and have some text being input */ public void disable(){ + softKeyboardIsActive = false; clear(); setVisibility(GONE); clearFocus(); diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/KeyEncoder.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/KeyEncoder.java index c3f26b3e73..4cfaf3da66 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/KeyEncoder.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/utils/KeyEncoder.java @@ -1,110 +1,62 @@ package net.kdt.pojavlaunch.utils; import net.kdt.pojavlaunch.AWTInputBridge; +import net.kdt.pojavlaunch.customcontrols.keyboard.TouchCharInput; -/* - About Key Events. Because the Android Spec doesn't require - soft keyboards to dispatch key events not all keyboard implementations - across Android will trigger these actions. +import java.util.HashMap; +import java.util.Map; - Currently we use the following function to translate keycodes for - special character, capital letters, and digits. +public class KeyEncoder { - keycode 123 (F12) is used as a single digit capslock button which - when sent to the miniclient before a char will act accordingly. - */ + private static final Map specialCharMap = createSpecialCharMap(); + private static final char MODIFIER = 123; // F12 key as a modifier for caps lock + private static final char BACKSPACE_ANDROID = 67; + private static final char BACKSPACE_UNICODE = 8; -public class KeyEncoder { + // Initialize the mapping of special characters to their respective keys + private static Map createSpecialCharMap() { + Map map = new HashMap<>(); + map.put('!', '1'); + map.put('@', '2'); + map.put('#', '3'); + map.put('$', '4'); + map.put('%', '5'); + map.put('^', '6'); + map.put('&', '7'); + map.put('*', '8'); + map.put('(', '9'); + map.put(')', '0'); + map.put('_', '-'); + map.put('+', '='); + map.put('{', '['); + map.put('}', ']'); + map.put(':', ';'); + map.put('"', '\''); + map.put('<', ','); + map.put('>', '.'); + map.put('?', '/'); + map.put('|', '\\'); + return map; + } - static String specialChars = "/*!@#$%^&*()\"{}_[+:;=-_]'|\\?/<>,."; - static char modifier = 123; - static char backspaceAndroid = 67; - public static char backspaceUnicode = 8; + public static void sendUnicodeBackspace(){ + AWTInputBridge.sendKey(BACKSPACE_UNICODE, BACKSPACE_UNICODE); + } - public static void sendEncodedChar(int keyCode, char iC){ - System.out.println(keyCode); - if(keyCode == backspaceAndroid){ - AWTInputBridge.sendKey(backspaceUnicode,backspaceUnicode); - } else if(specialChars.contains(""+iC)){ - // Send special character to client - char c = iC; - switch(c){ - case '!': - c = '1'; - break; - case '@': - c = '2'; - break; - case '#': - c = '3'; - break; - case '$': - c = '4'; - break; - case '%': - c = '5'; - break; - case '^': - c = '6'; - break; - case '&': - c = '7'; - break; - case '*': - c = '8'; - break; - case '(': - c = '9'; - break; - case ')': - c = '0'; - break; - case '_': - c = '-'; - break; - case '+': - c = '='; - break; - case '{': - c = '['; - break; - case '}': - c = ']'; - break; - case ':': - c = ';'; - break; - case '"': - c = '\''; - break; - case '<': - c = ','; - break; - case '>': - c = '.'; - break; - case '?': - c = '/'; - break; - case '|': - c = '\\'; - break; - } - if(c != iC){ - AWTInputBridge.sendKey(modifier,modifier); - } - AWTInputBridge.sendKey(c,c); - } else if(Character.isDigit(iC)){ - AWTInputBridge.sendKey(iC,iC); - } else if (iC == Character.toUpperCase(iC)){ - // We send F12 as a modifier to avoid needing to worry about shift. - // Client takes this modifier and does a toUpperCase(). - AWTInputBridge.sendKey(modifier,modifier); - AWTInputBridge.sendKey(Character.toUpperCase(iC),Character.toUpperCase(iC)); - } else if(iC == Character.toLowerCase(iC)){ - AWTInputBridge.sendKey(Character.toUpperCase(iC),Character.toUpperCase(iC)); + public static void sendEncodedChar(int keyCode, char c) { + if (keyCode == BACKSPACE_ANDROID && !TouchCharInput.softKeyboardIsActive) { + sendUnicodeBackspace(); + } else if (specialCharMap.containsKey(c)) { + AWTInputBridge.sendKey(specialCharMap.get(c), specialCharMap.get(c)); + } else if (Character.isDigit(c)) { + AWTInputBridge.sendKey(c, c); + } else if (Character.isLowerCase(c)){ + AWTInputBridge.sendKey(Character.toUpperCase(c),Character.toUpperCase(c)); + } else if (Character.isUpperCase(c)) { + AWTInputBridge.sendKey(MODIFIER, MODIFIER); + AWTInputBridge.sendKey(c, c); } else { - AWTInputBridge.sendKey(iC,keyCode); + AWTInputBridge.sendKey(c, keyCode); } } -} \ No newline at end of file +}