abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.keyboard2/KeyEventHandler.java
diff options
context:
space:
mode:
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();