From 68be82a4f92f47300b9960cf9cf65040c96f17ed Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Sun, 23 Feb 2025 12:12:29 +0100 Subject: Macro keys (#878) Add "macro" keys that behave as if a sequence of keys is typed. Macro can be added to custom layouts or through the "Add keys to the keyboard option". The syntax is: symbol:key1,key2,.. The symbol cannot contain a : character. 'key1', 'key2', etc.. are: - 'String with \' escaping' The key will generate the specified string. - keyevent:123 The key will send a keyevent. - The name of any special key --- srcs/juloo.keyboard2/KeyEventHandler.java | 34 ++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'srcs/juloo.keyboard2/KeyEventHandler.java') diff --git a/srcs/juloo.keyboard2/KeyEventHandler.java b/srcs/juloo.keyboard2/KeyEventHandler.java index 6809d88..d2546ab 100644 --- a/srcs/juloo.keyboard2/KeyEventHandler.java +++ b/srcs/juloo.keyboard2/KeyEventHandler.java @@ -97,11 +97,10 @@ public final class KeyEventHandler case Keyevent: send_key_down_up(key.getKeyevent()); break; case Modifier: break; case Editing: handle_editing_key(key.getEditing()); break; - case Compose_pending: - _recv.set_compose_pending(true); - break; + case Compose_pending: _recv.set_compose_pending(true); break; case Slider: handle_slider(key.getSlider(), key.getSliderRepeat()); break; case StringWithSymbol: send_text(key.getStringWithSymbol()); break; + case Macro: evaluate_macro(key.getMacro()); break; } update_meta_state(old_mods); } @@ -319,6 +318,35 @@ public final class KeyEventHandler send_key_down_up_repeat(KeyEvent.KEYCODE_DPAD_DOWN, d); } + void evaluate_macro(KeyValue[] keys) + { + final Pointers.Modifiers empty = Pointers.Modifiers.EMPTY; + // Ignore modifiers that are activated at the time the macro is evaluated + mods_changed(empty); + Pointers.Modifiers mods = empty; + final boolean autocap_paused = _autocap.pause(); + for (KeyValue kv : keys) + { + kv = KeyModifier.modify(kv, mods); + if (kv == null) + continue; + if (kv.hasFlagsAny(KeyValue.FLAG_LATCH)) + { + // Non-special latchable keys clear latched modifiers + if (!kv.hasFlagsAny(KeyValue.FLAG_SPECIAL)) + mods = empty; + mods = mods.with_extra_mod(kv); + } + else + { + key_down(kv, false); + key_up(kv, mods); + mods = empty; + } + } + _autocap.unpause(autocap_paused); + } + /** Repeat calls to [send_key_down_up]. */ void send_key_down_up_repeat(int event_code, int repeat) { -- cgit v1.2.3