diff options
| author | Jules Aguillon | 2023-08-06 01:30:02 +0200 |
|---|---|---|
| committer | Jules Aguillon | 2023-08-06 17:14:23 +0200 |
| commit | cd95c589de20a2d296e0cd2816ab8b5dadeb1a89 (patch) | |
| tree | 7e0a6b46984e2f5e5c77c09b8e5bf707bf2f9e19 /srcs/juloo.keyboard2/ExtraKeys.java | |
| parent | 0924df8d13d9c6b9a9c25084246c19274e69df50 (diff) | |
| download | unexpected-keyboard-cd95c589de20a2d296e0cd2816ab8b5dadeb1a89.tar.gz unexpected-keyboard-cd95c589de20a2d296e0cd2816ab8b5dadeb1a89.zip | |
Extra keys alternatives
For each extra key, a list of alternative can be specified. An extra key
won't be added to the keyboard if all its alternatives are already
present on it.
This is useful to avoid having the dead key for an accent and the
accented letters at the same time.
Diffstat (limited to 'srcs/juloo.keyboard2/ExtraKeys.java')
| -rw-r--r-- | srcs/juloo.keyboard2/ExtraKeys.java | 93 |
1 files changed, 65 insertions, 28 deletions
diff --git a/srcs/juloo.keyboard2/ExtraKeys.java b/srcs/juloo.keyboard2/ExtraKeys.java index 22187c1..36acaf1 100644 --- a/srcs/juloo.keyboard2/ExtraKeys.java +++ b/srcs/juloo.keyboard2/ExtraKeys.java @@ -1,6 +1,7 @@ package juloo.keyboard2; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -8,50 +9,86 @@ import java.util.Set; class ExtraKeys { - Map<String, List<KeyValue>> _keys_per_script; + List<ExtraKey> _ks; public ExtraKeys() { - _keys_per_script = new HashMap<String, List<KeyValue>>(); + _ks = new ArrayList<ExtraKey>(); } - public void add_keys_for_script(String script, List<KeyValue> kvs) + public void parse_and_add_keys_for_script(String script, String extra_keys_str) { - List<KeyValue> ks = _keys_per_script.get(script); - if (ks == null) ks = new ArrayList<KeyValue>(); - ks.addAll(kvs); - _keys_per_script.put(script, ks); + _ks.addAll(parse_extra_keys(script, extra_keys_str)); } - /** Add the keys that should be added to the keyboard into [dst]. [null] is - a valid script. */ - public void compute(Set<KeyValue> dst, String script) + /** Add the keys that should be added to the keyboard into [dst]. */ + public void compute(Set<KeyValue> dst, Query q) { - if (script == null) + for (ExtraKey k : _ks) { - for (String sc : _keys_per_script.keySet()) - get_keys_of_script(dst, sc); + if (k.should_add(q)) + dst.add(k.kv); } - else - { - get_keys_of_script(dst, null); - get_keys_of_script(dst, script); - } - } - - void get_keys_of_script(Set<KeyValue> dst, String script) - { - List<KeyValue> ks = _keys_per_script.get(script); - if (ks != null) - dst.addAll(ks); } - public static List<KeyValue> parse_extra_keys(String str) + public static List<ExtraKey> parse_extra_keys(String script, String str) { - List<KeyValue> dst = new ArrayList<KeyValue>(); + List<ExtraKey> dst = new ArrayList<ExtraKey>(); String[] ks = str.split("\\|"); for (int i = 0; i < ks.length; i++) - dst.add(KeyValue.getKeyByName(ks[i])); + dst.add(ExtraKey.parse(ks[i], script)); return dst; } + + final static class ExtraKey + { + /** The key to add. */ + final KeyValue kv; + /** The key will be added to layouts of the same script. If null, might be + added to layouts of any script. */ + final String script; + /** The key will not be added to layout that already contain all the + alternatives. */ + final List<KeyValue> alternatives; + + ExtraKey(KeyValue kv_, String script_, List<KeyValue> alts_) + { + kv = kv_; + script = script_; + alternatives = alts_; + } + + /** Whether the key should be added to the keyboard. */ + public boolean should_add(Query q) + { + return + (q.script == null || script == null || q.script.equals(script)) + && (alternatives.size() == 0 || !q.present.containsAll(alternatives)); + } + + /** Extra keys are of the form "key name" or "key name:alt 1:alt 2". */ + public static ExtraKey parse(String str, String script) + { + String[] strs = str.split(":"); + KeyValue kv = KeyValue.getKeyByName(strs[0]); + KeyValue[] alts = new KeyValue[strs.length-1]; + for (int i = 1; i < strs.length; i++) + alts[i-1] = KeyValue.getKeyByName(strs[i]); + return new ExtraKey(kv, script, Arrays.asList(alts)); + } + } + + public final static class Query + { + /** Script of the current layout. Might be null. */ + final String script; + /** Keys present on the layout. */ + final Set<KeyValue> present; + + public Query(String script_, Set<KeyValue> present_) + { + script = script_; + present = present_; + } + } } |
