From bfde31da6e74aa57e3bcd6f2985fd4588bd48814 Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Sun, 24 Jul 2022 23:32:14 +0200 Subject: [PATCH] Avoid automatic capitalisation when using arrows Disable capitalisation just after an arrow kind is pressed to avoid interrupting navigation. --- srcs/juloo.keyboard2/Autocapitalisation.java | 41 +++++++++++++++++--- srcs/juloo.keyboard2/Keyboard2.java | 9 ++++- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/srcs/juloo.keyboard2/Autocapitalisation.java b/srcs/juloo.keyboard2/Autocapitalisation.java index 1affdab..a055d3d 100644 --- a/srcs/juloo.keyboard2/Autocapitalisation.java +++ b/srcs/juloo.keyboard2/Autocapitalisation.java @@ -10,7 +10,8 @@ final class Autocapitalisation { private boolean _enabled = false; private boolean _beginning_of_sentence = false; - + /** Used to avoid enabling shift after an arrow key is pressed. */ + private boolean _skip_next_selection_update = false; /** Keep track of the cursor to differentiate 'selection_updated' events corresponding to typing from cursor movement. */ private int _cursor = 0; @@ -50,22 +51,50 @@ final class Autocapitalisation _beginning_of_sentence = false; } - public void selection_updated(int old_cursor, int new_cursor, InputConnection ic) + public void event_sent(int code) { + switch (code) + { + // Disable temporarily after a keyboard cursor movement + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_RIGHT: + case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_PAGE_UP: + case KeyEvent.KEYCODE_PAGE_DOWN: + case KeyEvent.KEYCODE_MOVE_HOME: + case KeyEvent.KEYCODE_MOVE_END: + _skip_next_selection_update = true; + _beginning_of_sentence = false; + break; + } + } + + /** Returns [true] if shift might be disabled. */ + public boolean selection_updated(int old_cursor, int new_cursor, InputConnection ic) + { + if (_skip_next_selection_update) + { + _cursor = new_cursor; + _skip_next_selection_update = false; + return false; + } if (new_cursor == _cursor) - return; - // Text has been inserted + return false; + // Text has been inserted or cursor moved forward if (old_cursor == _cursor && new_cursor > old_cursor) { scan_text_before_cursor(Math.min(new_cursor - old_cursor, 10), ic); + return true; } else { - // Cursor has moved or [_cursor] wasn't uptodate + // Cursor has moved backward or text deleted _beginning_of_sentence = false; scan_text_before_cursor(10, ic); + _cursor = new_cursor; + return true; } - _cursor = new_cursor; } /** Updates [_cursor]. */ diff --git a/srcs/juloo.keyboard2/Keyboard2.java b/srcs/juloo.keyboard2/Keyboard2.java index cec2b44..756295e 100644 --- a/srcs/juloo.keyboard2/Keyboard2.java +++ b/srcs/juloo.keyboard2/Keyboard2.java @@ -251,8 +251,8 @@ public class Keyboard2 extends InputMethodService public void onUpdateSelection(int oldSelStart, int oldSelEnd, int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd) { super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, candidatesStart, candidatesEnd); - _autocap.selection_updated(oldSelStart, newSelStart, getCurrentInputConnection()); - update_shift_state(true); + update_shift_state( + _autocap.selection_updated(oldSelStart, newSelStart, getCurrentInputConnection())); } @Override @@ -337,6 +337,11 @@ public class Keyboard2 extends InputMethodService if (conn == null) return; conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, meta)); + if (eventAction == KeyEvent.ACTION_UP) + { + _autocap.event_sent(eventCode); + update_shift_state(false); + } } public void showKeyboardConfig()