abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.keyboard2/KeyEventHandler.java
diff options
context:
space:
mode:
authorJules Aguillon2022-06-05 01:38:42 +0200
committerJules Aguillon2022-06-05 01:43:58 +0200
commit4127aa6f033a258aa89ff3704a952505c8c056cb (patch)
tree5a1dcada711e1ed85c28d626abf0b2e484f7fcff /srcs/juloo.keyboard2/KeyEventHandler.java
parent4f9375373e3ce9514550fa0470b40ae7f0ff19b2 (diff)
downloadunexpected-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.java71
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();