mirror of
https://github.com/Julow/Unexpected-Keyboard.git
synced 2024-11-21 14:53:11 +01:00
Allow Ctrl modmaps in layouts
The 'ctrl' modmap is different from the other modmaps as it also applies the built-in Ctrl modifier to the resulting character, even if it was first modified by the custom modmap. For example, this will map Ctrl+в to Ctrl+V (not to v): <ctrl a="в" b="v"/> This is intended to add keyboard shortcuts in non-latin layouts. A caveat is that the latin character appears on the keyboard while Ctrl is activated.
This commit is contained in:
parent
35f35b27be
commit
29b4b665dc
@ -51,7 +51,7 @@ public final class KeyModifier
|
||||
{
|
||||
switch (mod)
|
||||
{
|
||||
case CTRL:
|
||||
case CTRL: return apply_ctrl(k);
|
||||
case ALT:
|
||||
case META: return turn_into_keyevent(k);
|
||||
case FN: return apply_fn(k);
|
||||
@ -440,6 +440,19 @@ public final class KeyModifier
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyValue apply_ctrl(KeyValue k)
|
||||
{
|
||||
if (_modmap != null)
|
||||
{
|
||||
KeyValue mapped = _modmap.ctrl.get(k);
|
||||
// Do not return the modified character right away, first turn it into a
|
||||
// key event.
|
||||
if (mapped != null)
|
||||
k = mapped;
|
||||
}
|
||||
return turn_into_keyevent(k);
|
||||
}
|
||||
|
||||
private static KeyValue turn_into_keyevent(KeyValue k)
|
||||
{
|
||||
if (k.getKind() != KeyValue.Kind.Char)
|
||||
|
@ -563,18 +563,20 @@ public final class KeyboardData
|
||||
{
|
||||
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)
|
||||
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
|
||||
{
|
||||
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))
|
||||
{
|
||||
switch (parser.getName())
|
||||
@ -585,12 +587,15 @@ public final class KeyboardData
|
||||
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() + ">");
|
||||
}
|
||||
}
|
||||
|
||||
return new Modmap(shift, fn);
|
||||
return new Modmap(shift, fn, ctrl);
|
||||
}
|
||||
|
||||
private static void parse_mapping(XmlPullParser parser, Map<KeyValue, KeyValue> dst) throws Exception
|
||||
|
Loading…
Reference in New Issue
Block a user