diff options
| author | Jules Aguillon | 2022-06-05 01:38:42 +0200 |
|---|---|---|
| committer | Jules Aguillon | 2022-06-05 01:43:58 +0200 |
| commit | 4127aa6f033a258aa89ff3704a952505c8c056cb (patch) | |
| tree | 5a1dcada711e1ed85c28d626abf0b2e484f7fcff /srcs/juloo.keyboard2/KeyEventHandler.java | |
| parent | 4f9375373e3ce9514550fa0470b40ae7f0ff19b2 (diff) | |
| download | unexpected-keyboard-4127aa6f033a258aa89ff3704a952505c8c056cb.tar.gz unexpected-keyboard-4127aa6f033a258aa89ff3704a952505c8c056cb.zip | |
Stop using flags for modifiers
There was no free bits left to add new modifiers. Instead of increasing
the width of the 'flags' field, refactor the way modifiers are
represented and used.
Modifers are now represented as independent values and stored in the
'code' field. A flag is added to distinguish between modifiers and keys
with a key event.
The most notable change is that modifiers can no longer be or-ed into a
single value but have to be represented as an array.
Diffstat (limited to 'srcs/juloo.keyboard2/KeyEventHandler.java')
| -rw-r--r-- | srcs/juloo.keyboard2/KeyEventHandler.java | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/srcs/juloo.keyboard2/KeyEventHandler.java b/srcs/juloo.keyboard2/KeyEventHandler.java index 8382737..691e40d 100644 --- a/srcs/juloo.keyboard2/KeyEventHandler.java +++ b/srcs/juloo.keyboard2/KeyEventHandler.java @@ -11,11 +11,11 @@ class KeyEventHandler implements Config.IKeyEventHandler _recv = recv; } - public void handleKeyUp(KeyValue key, int flags) + public void handleKeyUp(KeyValue key, Pointers.Modifiers mods) { - if (key == null || (key.flags & KeyValue.FLAG_NOCHAR) != 0) + if (key == null || (key.flags & KeyValue.FLAG_MODIFIER) != 0) return; - switch (key.eventCode) + switch (key.code) { case KeyValue.EVENT_CONFIG: _recv.showKeyboardConfig(); return; case KeyValue.EVENT_SWITCH_TEXT: _recv.switchMain(); return; @@ -26,12 +26,10 @@ class KeyEventHandler implements Config.IKeyEventHandler case KeyValue.EVENT_ACTION: _recv.performAction(); return; case KeyValue.EVENT_SWITCH_PROGRAMMING: _recv.switchProgramming(); return; default: - if ((flags & (KeyValue.FLAG_CTRL | KeyValue.FLAG_ALT | KeyValue.FLAG_META)) != 0) - handleKeyUpWithModifier(key, flags); + if (shouldSendEvents(key, mods)) + handleKeyUpWithModifier(key, mods); else if (key.char_ != KeyValue.CHAR_NONE) _recv.commitChar(key.char_); - else if (key.eventCode != KeyValue.EVENT_NONE) - handleKeyUpWithModifier(key, flags); else _recv.commitText(key.symbol); } @@ -57,33 +55,58 @@ class KeyEventHandler implements Config.IKeyEventHandler return updatedMetaState; } - /* Send key events corresponding to pressed modifier keys. */ - private int sendMetaKeys(int flags, int metaState, boolean down) + private int sendMetaKeyForModifier(int mod, int metaState, boolean down) { - if ((flags & KeyValue.FLAG_CTRL) != 0) - metaState = sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down); - if ((flags & KeyValue.FLAG_ALT) != 0) - metaState = sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down); - if ((flags & KeyValue.FLAG_SHIFT) != 0) - metaState = sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down); - if ((flags & KeyValue.FLAG_META) != 0) - metaState = sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, metaState, down); - return metaState; + switch (mod) + { + case KeyValue.MOD_CTRL: + return sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down); + case KeyValue.MOD_ALT: + return sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down); + case KeyValue.MOD_SHIFT: + return sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down); + case KeyValue.MOD_META: + return sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, metaState, down); + default: return metaState; + } } /* * Don't set KeyEvent.FLAG_SOFT_KEYBOARD. */ - private void handleKeyUpWithModifier(KeyValue key, int flags) + private void handleKeyUpWithModifier(KeyValue key, Pointers.Modifiers mods) { - if (key.eventCode == KeyValue.EVENT_NONE) + if (key.code == KeyValue.EVENT_NONE) return ; - int metaState = sendMetaKeys(flags, 0, true); - _recv.sendKeyEvent(KeyEvent.ACTION_DOWN, key.eventCode, metaState); - _recv.sendKeyEvent(KeyEvent.ACTION_UP, key.eventCode, metaState); - sendMetaKeys(flags, metaState, false); + int metaState = 0; + for (int i = 0; i < mods.size(); i++) + metaState = sendMetaKeyForModifier(mods.get(i), metaState, true); + _recv.sendKeyEvent(KeyEvent.ACTION_DOWN, key.code, metaState); + _recv.sendKeyEvent(KeyEvent.ACTION_UP, key.code, metaState); + for (int i = mods.size() - 1; i >= 0; i--) + metaState = sendMetaKeyForModifier(mods.get(i), metaState, false); } + /** Whether to send up and down events (true) or commit the text (false). */ + private boolean shouldSendEvents(KeyValue key, Pointers.Modifiers mods) + { + // Check for modifiers + for (int i = 0; i < mods.size(); i++) + { + switch (mods.get(i)) + { + case KeyValue.MOD_CTRL: + case KeyValue.MOD_ALT: + case KeyValue.MOD_META: return true; + default: break; + } + } + // Key has no char but has a key event + if (key.char_ == KeyValue.CHAR_NONE && key.code >= 0) + return true; + return false; + } + public static interface IReceiver { public void switchToNextInputMethod(); |
