diff --git a/srcs/juloo.keyboard2/KeyEventHandler.java b/srcs/juloo.keyboard2/KeyEventHandler.java index dad6642..86cfc8c 100644 --- a/srcs/juloo.keyboard2/KeyEventHandler.java +++ b/srcs/juloo.keyboard2/KeyEventHandler.java @@ -25,11 +25,11 @@ class KeyEventHandler implements Config.IKeyEventHandler case KeyValue.EVENT_ACTION: _recv.performAction(); return; default: if ((flags & (KeyValue.FLAG_CTRL | KeyValue.FLAG_ALT | KeyValue.FLAG_META)) != 0) - handleMetaKeyUp(key, flags); + handleKeyUpWithModifier(key, flags); else if (key.char_ != KeyValue.CHAR_NONE) _recv.commitChar(key.char_); else if (key.eventCode != KeyValue.EVENT_NONE) - handleMetaKeyUp(key, flags); + handleKeyUpWithModifier(key, flags); else _recv.commitText(key.symbol); } @@ -45,22 +45,43 @@ class KeyEventHandler implements Config.IKeyEventHandler // getCurrentInputConnection().deleteSurroundingText(before, after); // } - private void handleMetaKeyUp(KeyValue key, int flags) + private int sendMetaKey(int eventCode, int metaFlags, int metaState, boolean down) { - int meta = 0; - if (key.eventCode == KeyValue.EVENT_NONE) - return ; - if ((flags & KeyValue.FLAG_CTRL) != 0) - meta |= KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON; - if ((flags & KeyValue.FLAG_ALT) != 0) - meta |= KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON; - if ((flags & KeyValue.FLAG_SHIFT) != 0) - meta |= KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON; - if ((flags & KeyValue.FLAG_META) != 0) - meta |= KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON; - _recv.sendKeyEvent(key.eventCode, meta); + int action; + int updatedMetaState; + if (down) { action = KeyEvent.ACTION_DOWN; updatedMetaState = metaState | metaFlags; } + else { action = KeyEvent.ACTION_UP; updatedMetaState = metaState & ~metaFlags; } + _recv.sendKeyEvent(action, eventCode, metaState); + return updatedMetaState; } + /* Send key events corresponding to pressed modifier keys. */ + private int sendMetaKeys(int flags, 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; + } + + /* + * Don't set KeyEvent.FLAG_SOFT_KEYBOARD. + */ + private void handleKeyUpWithModifier(KeyValue key, int flags) + { + if (key.eventCode == 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); + } + public static interface IReceiver { public void switchToNextInputMethod(); @@ -72,7 +93,7 @@ class KeyEventHandler implements Config.IKeyEventHandler /** 'res_id' is '-1' for the currently selected layout. */ public void setLayout(int res_id); - public void sendKeyEvent(int eventCode, int meta); + public void sendKeyEvent(int eventAction, int eventCode, int meta); public void commitText(String text); public void commitChar(char c); diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java index 0ce3af8..44b36a1 100644 --- a/srcs/juloo.keyboard2/Keyboard2.java +++ b/srcs/juloo.keyboard2/Keyboard2.java @@ -256,14 +256,12 @@ public class Keyboard2 extends InputMethodService _keyboardView.setKeyboard(getLayout(res_id)); } - public void sendKeyEvent(int eventCode, int meta) + public void sendKeyEvent(int eventAction, int eventCode, int meta) { InputConnection conn = getCurrentInputConnection(); if (conn == null) return; - KeyEvent event = new KeyEvent(1, 1, KeyEvent.ACTION_DOWN, eventCode, 0, meta); - conn.sendKeyEvent(event); - conn.sendKeyEvent(KeyEvent.changeAction(event, KeyEvent.ACTION_UP)); + conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, meta)); } public void showKeyboardConfig()