From 31d6a70dfb9c7ad3a72302bca2339f926e4593ee Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Mon, 6 Jun 2022 00:23:45 +0200 Subject: Refactor: Remove KeyValue.name This makes KeyValue objects smaller. 'equals' and 'hashCode' are now implemented too. Key names are still used to recognise keys with special meaning, but not for comparing keys anymore. --- srcs/juloo.keyboard2/KeyModifier.java | 175 ++++++++++++++++++---------------- 1 file changed, 94 insertions(+), 81 deletions(-) (limited to 'srcs/juloo.keyboard2/KeyModifier.java') diff --git a/srcs/juloo.keyboard2/KeyModifier.java b/srcs/juloo.keyboard2/KeyModifier.java index 4089ab8..fa23217 100644 --- a/srcs/juloo.keyboard2/KeyModifier.java +++ b/srcs/juloo.keyboard2/KeyModifier.java @@ -7,11 +7,8 @@ import java.util.HashMap; class KeyModifier { /** Cache key is KeyValue's name */ - private static HashMap> _cache = - new HashMap>(); - - /** Represents a removed key, because a cache entry can't be [null]. */ - private static final KeyValue removed_key = KeyValue.getKeyByName("removed"); + private static HashMap> _cache = + new HashMap>(); /** Modify a key according to modifiers. */ public static KeyValue modify(KeyValue k, Pointers.Modifiers mods) @@ -27,10 +24,10 @@ class KeyModifier /* Order: Fn, Shift, accents */ for (int i = 0; i < n_mods; i++) r = modify(r, mods.get(i)); - r = remove_placeholders(r); ks.put(mods, r); } - return (r == removed_key) ? null : r; + /* Keys with an empty string are placeholder keys. */ + return (r.getString().length() == 0) ? null : r; } public static KeyValue modify(KeyValue k, KeyValue.Modifier mod) @@ -117,70 +114,97 @@ class KeyModifier private static KeyValue apply_fn(KeyValue k) { - String name; - switch (k.name) + String name = null; + switch (k.getKind()) + { + case Char: name = apply_fn_char(k.getChar()); break; + case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break; + case String: + switch (k.getString()) + { + case "": + if (k == KeyValue.getKeyByName("f11_placeholder")) + name = "f11"; + else if (k == KeyValue.getKeyByName("f12_placeholder")) + name = "f12"; + break; + } + break; + } + return (name == null) ? k : KeyValue.getKeyByName(name); + } + + private static String apply_fn_keyevent(int code) + { + switch (code) { - case "1": name = "f1"; break; - case "2": name = "f2"; break; - case "3": name = "f3"; break; - case "4": name = "f4"; break; - case "5": name = "f5"; break; - case "6": name = "f6"; break; - case "7": name = "f7"; break; - case "8": name = "f8"; break; - case "9": name = "f9"; break; - case "0": name = "f10"; break; - case "f11_placeholder": name = "f11"; break; - case "f12_placeholder": name = "f12"; break; - case "up": name = "page_up"; break; - case "down": name = "page_down"; break; - case "left": name = "home"; break; - case "right": name = "end"; break; - case "<": name = "«"; break; - case ">": name = "»"; break; - case "{": name = "‹"; break; - case "}": name = "›"; break; - case "[": name = "‘"; break; - case "]": name = "’"; break; - case "(": name = "“"; break; - case ")": name = "”"; break; - case "'": name = "‚"; break; - case "\"": name = "„"; break; - case "-": name = "–"; break; - case "_": name = "—"; break; - case "^": name = "¬"; break; - case "%": name = "‰"; break; - case "=": name = "≈"; break; - case "u": name = "µ"; break; - case "a": name = "æ"; break; - case "o": name = "œ"; break; - case "esc": name = "insert"; break; - case "*": name = "°"; break; - case ".": name = "…"; break; - case ",": name = "·"; break; - case "!": name = "¡"; break; - case "?": name = "¿"; break; - case "tab": name = "\\t"; break; - case "space": name = "nbsp"; break; - case "↖": name = "⇖"; break; - case "↑": name = "⇑"; break; - case "↗": name = "⇗"; break; - case "←": name = "⇐"; break; - case "→": name = "⇒"; break; - case "↙": name = "⇙"; break; - case "↓": name = "⇓"; break; - case "↘": name = "⇘"; break; + case KeyEvent.KEYCODE_DPAD_UP: return "page_up"; + case KeyEvent.KEYCODE_DPAD_DOWN: return "page_down"; + case KeyEvent.KEYCODE_DPAD_LEFT: return "home"; + case KeyEvent.KEYCODE_DPAD_RIGHT: return "end"; + case KeyEvent.KEYCODE_ESCAPE: return "insert"; + default: return null; + } + } + + /** Return the name of modified key, or [null]. */ + private static String apply_fn_char(char c) + { + switch (c) + { + case '1': return "f1"; + case '2': return "f2"; + case '3': return "f3"; + case '4': return "f4"; + case '5': return "f5"; + case '6': return "f6"; + case '7': return "f7"; + case '8': return "f8"; + case '9': return "f9"; + case '0': return "f10"; + case '<': return "«"; + case '>': return "»"; + case '{': return "‹"; + case '}': return "›"; + case '[': return "‘"; + case ']': return "’"; + case '(': return "“"; + case ')': return "”"; + case '\'': return "‚"; + case '"': return "„"; + case '-': return "–"; + case '_': return "—"; + case '^': return "¬"; + case '%': return "‰"; + case '=': return "≈"; + case 'u': return "µ"; + case 'a': return "æ"; + case 'o': return "œ"; + case '*': return "°"; + case '.': return "…"; + case ',': return "·"; + case '!': return "¡"; + case '?': return "¿"; + case '↖': return "⇖"; + case '↑': return "⇑"; + case '↗': return "⇗"; + case '←': return "⇐"; + case '→': return "⇒"; + case '↙': return "⇙"; + case '↓': return "⇓"; + case '↘': return "⇘"; // Currency symbols - case "e": name = "€"; break; - case "l": name = "£"; break; - case "r": name = "₹"; break; - case "y": name = "¥"; break; - case "c": name = "¢"; break; - case "p": name = "₱"; break; - case "€": case "£": return removed_key; // Avoid showing these twice - default: return k; + case 'e': return "€"; + case 'l': return "£"; + case 'r': return "₹"; + case 'y': return "¥"; + case 'c': return "¢"; + case 'p': return "₱"; + case '€': case '£': return "removed"; // Avoid showing these twice + case '\t': return "\\t"; + case ' ': return "nbsp"; + default: return null; } - return KeyValue.getKeyByName(name); } private static KeyValue turn_into_keyevent(KeyValue k) @@ -249,25 +273,14 @@ class KeyModifier return k.withKeyevent(e); } - /** Remove placeholder keys that haven't been modified into something. */ - private static KeyValue remove_placeholders(KeyValue k) - { - switch (k.name) - { - case "f11_placeholder": - case "f12_placeholder": return removed_key; - default: return k; - } - } - /* Lookup the cache entry for a key. Create it needed. */ private static HashMap cacheEntry(KeyValue k) { - HashMap ks = _cache.get(k.name); + HashMap ks = _cache.get(k); if (ks == null) { ks = new HashMap(); - _cache.put(k.name, ks); + _cache.put(k, ks); } return ks; } -- cgit v1.2.3