diff options
Diffstat (limited to 'srcs')
| -rw-r--r-- | srcs/juloo.keyboard2/KeyModifier.java | 10 | ||||
| -rw-r--r-- | srcs/juloo.keyboard2/KeyboardData.java | 65 | ||||
| -rw-r--r-- | srcs/juloo.keyboard2/Modmap.java | 33 |
3 files changed, 61 insertions, 47 deletions
diff --git a/srcs/juloo.keyboard2/KeyModifier.java b/srcs/juloo.keyboard2/KeyModifier.java index e512521..18fe2d7 100644 --- a/srcs/juloo.keyboard2/KeyModifier.java +++ b/srcs/juloo.keyboard2/KeyModifier.java @@ -8,8 +8,8 @@ public final class KeyModifier { /** The optional modmap takes priority over modifiers usual behaviors. Set to [null] to disable. */ - private static KeyboardData.Modmap _modmap = null; - public static void set_modmap(KeyboardData.Modmap mm) + private static Modmap _modmap = null; + public static void set_modmap(Modmap mm) { _modmap = mm; } @@ -190,7 +190,7 @@ public final class KeyModifier { if (_modmap != null) { - KeyValue mapped = _modmap.shift.get(k); + KeyValue mapped = _modmap.get(Modmap.M.Shift, k); if (mapped != null) return mapped; } @@ -215,7 +215,7 @@ public final class KeyModifier { if (_modmap != null) { - KeyValue mapped = _modmap.fn.get(k); + KeyValue mapped = _modmap.get(Modmap.M.Fn, k); if (mapped != null) return mapped; } @@ -289,7 +289,7 @@ public final class KeyModifier { if (_modmap != null) { - KeyValue mapped = _modmap.ctrl.get(k); + KeyValue mapped = _modmap.get(Modmap.M.Ctrl, k); // Do not return the modified character right away, first turn it into a // key event. if (mapped != null) diff --git a/srcs/juloo.keyboard2/KeyboardData.java b/srcs/juloo.keyboard2/KeyboardData.java index e4a7506..f5cc87e 100644 --- a/srcs/juloo.keyboard2/KeyboardData.java +++ b/srcs/juloo.keyboard2/KeyboardData.java @@ -260,7 +260,7 @@ public final class KeyboardData case "modmap": if (modmap != null) throw error(parser, "Multiple '<modmap>' are not allowed"); - modmap = Modmap.parse(parser); + modmap = parse_modmap(parser); break; default: throw error(parser, "Expecting tag <row>, got <" + parser.getName() + ">"); @@ -555,53 +555,34 @@ public final class KeyboardData } } - public static class Modmap + public static Modmap parse_modmap(XmlPullParser parser) throws Exception { - public final Map<KeyValue, KeyValue> shift; - public final Map<KeyValue, KeyValue> fn; - public final Map<KeyValue, KeyValue> ctrl; - - public Modmap(Map<KeyValue, KeyValue> s, Map<KeyValue, KeyValue> f, Map<KeyValue, KeyValue> c) - { - shift = s; - fn = f; - ctrl = c; - } - - public static Modmap parse(XmlPullParser parser) throws Exception + Modmap mm = new Modmap(); + while (next_tag(parser)) { - HashMap<KeyValue, KeyValue> shift = new HashMap<KeyValue, KeyValue>(); - HashMap<KeyValue, KeyValue> fn = new HashMap<KeyValue, KeyValue>(); - HashMap<KeyValue, KeyValue> ctrl = new HashMap<KeyValue, KeyValue>(); - while (next_tag(parser)) + Modmap.M m; + switch (parser.getName()) { - switch (parser.getName()) - { - case "shift": - parse_mapping(parser, shift); - break; - case "fn": - parse_mapping(parser, fn); - break; - case "ctrl": - parse_mapping(parser, ctrl); - break; - default: - throw error(parser, "Expecting tag <shift> or <fn>, got <" + parser.getName() + ">"); - } + case "shift": m = Modmap.M.Shift; break; + case "fn": m = Modmap.M.Fn; break; + case "ctrl": m = Modmap.M.Ctrl; break; + default: + throw error(parser, "Expecting tag <shift> or <fn>, got <" + + parser.getName() + ">"); } - - return new Modmap(shift, fn, ctrl); + parse_modmap_mapping(parser, mm, m); } + return mm; + } - private static void parse_mapping(XmlPullParser parser, Map<KeyValue, KeyValue> dst) throws Exception - { - KeyValue a = KeyValue.getKeyByName(parser.getAttributeValue(null, "a")); - KeyValue b = KeyValue.getKeyByName(parser.getAttributeValue(null, "b")); - while (parser.next() != XmlPullParser.END_TAG) - continue; - dst.put(a, b); - } + private static void parse_modmap_mapping(XmlPullParser parser, Modmap mm, + Modmap.M m) throws Exception + { + KeyValue a = KeyValue.getKeyByName(parser.getAttributeValue(null, "a")); + KeyValue b = KeyValue.getKeyByName(parser.getAttributeValue(null, "b")); + while (parser.next() != XmlPullParser.END_TAG) + continue; + mm.add(m, a, b); } /** Position of a key on the layout. */ diff --git a/srcs/juloo.keyboard2/Modmap.java b/srcs/juloo.keyboard2/Modmap.java new file mode 100644 index 0000000..77ee64d --- /dev/null +++ b/srcs/juloo.keyboard2/Modmap.java @@ -0,0 +1,33 @@ +package juloo.keyboard2; + +import java.lang.reflect.Array; +import java.util.Map; +import java.util.TreeMap; + +/** Stores key combinations that are applied by [KeyModifier]. */ +public final class Modmap +{ + public enum M { Shift, Fn, Ctrl } + + Map<KeyValue, KeyValue>[] _map; + + public Modmap() + { + _map = (Map<KeyValue, KeyValue>[])Array.newInstance(TreeMap.class, + M.values().length); + } + + public void add(M m, KeyValue a, KeyValue b) + { + int i = m.ordinal(); + if (_map[i] == null) + _map[i] = new TreeMap<KeyValue, KeyValue>(); + _map[i].put(a, b); + } + + public KeyValue get(M m, KeyValue a) + { + Map<KeyValue, KeyValue> mm = _map[m.ordinal()]; + return (mm == null) ? null : mm.get(a); + } +} |
