diff options
| author | Jules Aguillon | 2024-12-08 11:41:50 +0100 |
|---|---|---|
| committer | Jules Aguillon | 2024-12-08 11:41:50 +0100 |
| commit | 2060e6ab07ea1b16b368e2bab2423cfa35fac760 (patch) | |
| tree | 64205f49d7f2d466614e8c85170f4f5c0a9ac031 | |
| parent | b3d28a65d1a98a0e92486b34db28985b34bdbaf4 (diff) | |
| download | unexpected-keyboard-2060e6ab07ea1b16b368e2bab2423cfa35fac760.tar.gz unexpected-keyboard-2060e6ab07ea1b16b368e2bab2423cfa35fac760.zip | |
Add :keyevent key syntax
Allow to add keyevent keys to the keyboard. For example to add a
Play/Pause button:
:keyevent symbol='⏯' flags='small':85
| -rw-r--r-- | doc/Possible-key-values.md | 8 | ||||
| -rw-r--r-- | srcs/juloo.keyboard2/KeyValue.java | 4 | ||||
| -rw-r--r-- | srcs/juloo.keyboard2/KeyValueParser.java | 36 |
3 files changed, 35 insertions, 13 deletions
diff --git a/doc/Possible-key-values.md b/doc/Possible-key-values.md index fbac203..5563078 100644 --- a/doc/Possible-key-values.md +++ b/doc/Possible-key-values.md @@ -189,3 +189,11 @@ keys. For example: - `:char symbol='љ':q`, which is used to implement `ctrl` shortcuts in cyrillic layouts. + +### Kind `keyevent` + +Defines a key that sends an Android [key event](https://developer.android.com/reference/android/view/KeyEvent). +`<payload>` is the key event number. + +For example: +- `:keyevent symbol='⏯' flags='small':85` diff --git a/srcs/juloo.keyboard2/KeyValue.java b/srcs/juloo.keyboard2/KeyValue.java index d572b03..fcb9ed0 100644 --- a/srcs/juloo.keyboard2/KeyValue.java +++ b/srcs/juloo.keyboard2/KeyValue.java @@ -345,12 +345,12 @@ public final class KeyValue implements Comparable<KeyValue> return eventKey(String.valueOf((char)symbol), e, flags | FLAG_KEY_FONT); } - private static KeyValue keyeventKey(String symbol, int code, int flags) + public static KeyValue keyeventKey(String symbol, int code, int flags) { return new KeyValue(symbol, Kind.Keyevent, code, flags | FLAG_SECONDARY); } - private static KeyValue keyeventKey(int symbol, int code, int flags) + public static KeyValue keyeventKey(int symbol, int code, int flags) { return keyeventKey(String.valueOf((char)symbol), code, flags | FLAG_KEY_FONT); } diff --git a/srcs/juloo.keyboard2/KeyValueParser.java b/srcs/juloo.keyboard2/KeyValueParser.java index 7e4ba26..0a5ce17 100644 --- a/srcs/juloo.keyboard2/KeyValueParser.java +++ b/srcs/juloo.keyboard2/KeyValueParser.java @@ -22,7 +22,7 @@ public final class KeyValueParser static Pattern ATTR_PAT; static Pattern QUOTED_PAT; static Pattern PAYLOAD_START_PAT; - static Pattern SINGLE_CHAR_PAT; + static Pattern WORD_PAT; static public KeyValue parse(String str) throws ParseError { @@ -57,17 +57,31 @@ public final class KeyValueParser // Payload if (!match(m, PAYLOAD_START_PAT)) parseError("Unexpected character", m); + String payload; switch (kind) { case "str": - String str_payload = parseSingleQuotedString(m); + payload = parseSingleQuotedString(m); if (symbol == null) - return KeyValue.makeStringKey(str_payload, flags); - return KeyValue.makeStringKeyWithSymbol(str_payload, symbol, flags); + return KeyValue.makeStringKey(payload, flags); + return KeyValue.makeStringKeyWithSymbol(payload, symbol, flags); case "char": - char char_payload = parseOneChar(m); - return KeyValue.makeCharKey(char_payload, symbol, flags); + payload = parsePayloadWord(m); + if (payload.length() != 1) + parseError("Expected a single character payload", m); + return KeyValue.makeCharKey(payload.charAt(0), symbol, flags); + + case "keyevent": + payload = parsePayloadWord(m); + int eventcode = 0; + try { eventcode = Integer.parseInt(payload); } + catch (Exception _e) + { parseError("Expected an integer payload", m); } + if (symbol == null) + symbol = String.valueOf(eventcode); + return KeyValue.keyeventKey(symbol, eventcode, flags); + default: break; } parseError("Unknown kind '"+kind+"'", m, 1); @@ -81,11 +95,11 @@ public final class KeyValueParser return m.group(1).replace("\\'", "'"); } - static char parseOneChar(Matcher m) throws ParseError + static String parsePayloadWord(Matcher m) throws ParseError { - if (!match(m, SINGLE_CHAR_PAT)) - parseError("Expected a character", m); - return m.group(0).charAt(0); + if (!match(m, WORD_PAT)) + parseError("Expected a word after ':' made of [a-zA-Z0-9_]", m); + return m.group(0); } static int parseFlags(String s, Matcher m) throws ParseError @@ -118,7 +132,7 @@ public final class KeyValueParser ATTR_PAT = Pattern.compile("\\s*(\\w+)\\s*="); QUOTED_PAT = Pattern.compile("'(([^'\\\\]+|\\\\')*)'"); PAYLOAD_START_PAT = Pattern.compile("\\s*:"); - SINGLE_CHAR_PAT = Pattern.compile("."); + WORD_PAT = Pattern.compile("[a-zA-Z0-9_]*"); } static void parseError(String msg, Matcher m) throws ParseError |
