abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.keyboard2/KeyModifier.java
diff options
context:
space:
mode:
authorJules Aguillon2026-02-19 00:37:42 +0100
committerGitHub2026-02-19 00:37:42 +0100
commitdf3594bd53c71d06f6e103f6782bb26b970beac4 (patch)
treec998211c06617baadd821a1a9bee03a66f1b51ee /srcs/juloo.keyboard2/KeyModifier.java
parentebf80415d8034d853bd79ba7cfb578db67862529 (diff)
downloadunexpected-keyboard-df3594bd53c71d06f6e103f6782bb26b970beac4.tar.gz
unexpected-keyboard-df3594bd53c71d06f6e103f6782bb26b970beac4.zip
Autocomplete on space bar and undo on delete (#1179)
* Refactor: Implement the space key as an editing action The space key is no longer a CHAR key but now an EDITING key. This allows changing the behavior of the space bar while allowing custom layout users to define a key outputing a space as before. KeyModifier and ComposeKey are updated to treat the space key as before. * Enter the best suggestion when the space bar is pressed * Refactor: Implement backspace as an editing action * Undo suggestion when delete is pressed The delete key (backspace internally) undoes the suggestion if the last action done was entering the suggestion with either the space bar or the candidates view. * Add an option to enable space bar autocomplete This option is off by default. Undoing a completion with backspace works in any case. * Refactor: Track selection emptyness in CurrentlyTypedWord This removes an expensive RPC call.
Diffstat (limited to 'srcs/juloo.keyboard2/KeyModifier.java')
-rw-r--r--srcs/juloo.keyboard2/KeyModifier.java161
1 files changed, 98 insertions, 63 deletions
diff --git a/srcs/juloo.keyboard2/KeyModifier.java b/srcs/juloo.keyboard2/KeyModifier.java
index c40c342..3ef16bc 100644
--- a/srcs/juloo.keyboard2/KeyModifier.java
+++ b/srcs/juloo.keyboard2/KeyModifier.java
@@ -178,15 +178,26 @@ public final class KeyModifier
private static KeyValue apply_dead_char(KeyValue k, char dead_char)
{
+ KeyValue r = null;
switch (k.getKind())
{
- case Char:
- char c = k.getChar();
- char modified = (char)KeyCharacterMap.getDeadChar(dead_char, c);
- if (modified != 0 && modified != c)
- return KeyValue.makeStringKey(String.valueOf(modified));
+ case Char: r = apply_dead_char(k.getChar(), dead_char); break;
+ case Editing:
+ switch (k.getEditing())
+ {
+ case SPACE_BAR: r = apply_dead_char(' ', dead_char); break;
+ }
+ break;
}
- return k;
+ return (r == null) ? k : r;
+ }
+
+ private static KeyValue apply_dead_char(char c, char dead_char)
+ {
+ char modified = (char)KeyCharacterMap.getDeadChar(dead_char, c);
+ if (modified != 0 && modified != c)
+ return KeyValue.makeStringKey(String.valueOf(modified));
+ return null;
}
private static KeyValue apply_combining_char(KeyValue k, String combining)
@@ -294,6 +305,7 @@ public final class KeyModifier
{
case UNDO: return "redo";
case PASTE: return "pasteAsPlainText";
+ case SPACE_BAR: return "nbsp";
default: return null;
}
}
@@ -313,65 +325,76 @@ public final class KeyModifier
private static KeyValue turn_into_keyevent(KeyValue k)
{
- if (k.getKind() != KeyValue.Kind.Char)
- return k;
int e;
- switch (k.getChar())
+ switch (k.getKind())
{
- case 'a': e = KeyEvent.KEYCODE_A; break;
- case 'b': e = KeyEvent.KEYCODE_B; break;
- case 'c': e = KeyEvent.KEYCODE_C; break;
- case 'd': e = KeyEvent.KEYCODE_D; break;
- case 'e': e = KeyEvent.KEYCODE_E; break;
- case 'f': e = KeyEvent.KEYCODE_F; break;
- case 'g': e = KeyEvent.KEYCODE_G; break;
- case 'h': e = KeyEvent.KEYCODE_H; break;
- case 'i': e = KeyEvent.KEYCODE_I; break;
- case 'j': e = KeyEvent.KEYCODE_J; break;
- case 'k': e = KeyEvent.KEYCODE_K; break;
- case 'l': e = KeyEvent.KEYCODE_L; break;
- case 'm': e = KeyEvent.KEYCODE_M; break;
- case 'n': e = KeyEvent.KEYCODE_N; break;
- case 'o': e = KeyEvent.KEYCODE_O; break;
- case 'p': e = KeyEvent.KEYCODE_P; break;
- case 'q': e = KeyEvent.KEYCODE_Q; break;
- case 'r': e = KeyEvent.KEYCODE_R; break;
- case 's': e = KeyEvent.KEYCODE_S; break;
- case 't': e = KeyEvent.KEYCODE_T; break;
- case 'u': e = KeyEvent.KEYCODE_U; break;
- case 'v': e = KeyEvent.KEYCODE_V; break;
- case 'w': e = KeyEvent.KEYCODE_W; break;
- case 'x': e = KeyEvent.KEYCODE_X; break;
- case 'y': e = KeyEvent.KEYCODE_Y; break;
- case 'z': e = KeyEvent.KEYCODE_Z; break;
- case '0': e = KeyEvent.KEYCODE_0; break;
- case '1': e = KeyEvent.KEYCODE_1; break;
- case '2': e = KeyEvent.KEYCODE_2; break;
- case '3': e = KeyEvent.KEYCODE_3; break;
- case '4': e = KeyEvent.KEYCODE_4; break;
- case '5': e = KeyEvent.KEYCODE_5; break;
- case '6': e = KeyEvent.KEYCODE_6; break;
- case '7': e = KeyEvent.KEYCODE_7; break;
- case '8': e = KeyEvent.KEYCODE_8; break;
- case '9': e = KeyEvent.KEYCODE_9; break;
- case '`': e = KeyEvent.KEYCODE_GRAVE; break;
- case '-': e = KeyEvent.KEYCODE_MINUS; break;
- case '=': e = KeyEvent.KEYCODE_EQUALS; break;
- case '[': e = KeyEvent.KEYCODE_LEFT_BRACKET; break;
- case ']': e = KeyEvent.KEYCODE_RIGHT_BRACKET; break;
- case '\\': e = KeyEvent.KEYCODE_BACKSLASH; break;
- case ';': e = KeyEvent.KEYCODE_SEMICOLON; break;
- case '\'': e = KeyEvent.KEYCODE_APOSTROPHE; break;
- case '/': e = KeyEvent.KEYCODE_SLASH; break;
- case '@': e = KeyEvent.KEYCODE_AT; break;
- case '+': e = KeyEvent.KEYCODE_PLUS; break;
- case ',': e = KeyEvent.KEYCODE_COMMA; break;
- case '.': e = KeyEvent.KEYCODE_PERIOD; break;
- case '*': e = KeyEvent.KEYCODE_STAR; break;
- case '#': e = KeyEvent.KEYCODE_POUND; break;
- case '(': e = KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN; break;
- case ')': e = KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN; break;
- case ' ': e = KeyEvent.KEYCODE_SPACE; break;
+ case Char:
+ switch (k.getChar())
+ {
+ case 'a': e = KeyEvent.KEYCODE_A; break;
+ case 'b': e = KeyEvent.KEYCODE_B; break;
+ case 'c': e = KeyEvent.KEYCODE_C; break;
+ case 'd': e = KeyEvent.KEYCODE_D; break;
+ case 'e': e = KeyEvent.KEYCODE_E; break;
+ case 'f': e = KeyEvent.KEYCODE_F; break;
+ case 'g': e = KeyEvent.KEYCODE_G; break;
+ case 'h': e = KeyEvent.KEYCODE_H; break;
+ case 'i': e = KeyEvent.KEYCODE_I; break;
+ case 'j': e = KeyEvent.KEYCODE_J; break;
+ case 'k': e = KeyEvent.KEYCODE_K; break;
+ case 'l': e = KeyEvent.KEYCODE_L; break;
+ case 'm': e = KeyEvent.KEYCODE_M; break;
+ case 'n': e = KeyEvent.KEYCODE_N; break;
+ case 'o': e = KeyEvent.KEYCODE_O; break;
+ case 'p': e = KeyEvent.KEYCODE_P; break;
+ case 'q': e = KeyEvent.KEYCODE_Q; break;
+ case 'r': e = KeyEvent.KEYCODE_R; break;
+ case 's': e = KeyEvent.KEYCODE_S; break;
+ case 't': e = KeyEvent.KEYCODE_T; break;
+ case 'u': e = KeyEvent.KEYCODE_U; break;
+ case 'v': e = KeyEvent.KEYCODE_V; break;
+ case 'w': e = KeyEvent.KEYCODE_W; break;
+ case 'x': e = KeyEvent.KEYCODE_X; break;
+ case 'y': e = KeyEvent.KEYCODE_Y; break;
+ case 'z': e = KeyEvent.KEYCODE_Z; break;
+ case '0': e = KeyEvent.KEYCODE_0; break;
+ case '1': e = KeyEvent.KEYCODE_1; break;
+ case '2': e = KeyEvent.KEYCODE_2; break;
+ case '3': e = KeyEvent.KEYCODE_3; break;
+ case '4': e = KeyEvent.KEYCODE_4; break;
+ case '5': e = KeyEvent.KEYCODE_5; break;
+ case '6': e = KeyEvent.KEYCODE_6; break;
+ case '7': e = KeyEvent.KEYCODE_7; break;
+ case '8': e = KeyEvent.KEYCODE_8; break;
+ case '9': e = KeyEvent.KEYCODE_9; break;
+ case '`': e = KeyEvent.KEYCODE_GRAVE; break;
+ case '-': e = KeyEvent.KEYCODE_MINUS; break;
+ case '=': e = KeyEvent.KEYCODE_EQUALS; break;
+ case '[': e = KeyEvent.KEYCODE_LEFT_BRACKET; break;
+ case ']': e = KeyEvent.KEYCODE_RIGHT_BRACKET; break;
+ case '\\': e = KeyEvent.KEYCODE_BACKSLASH; break;
+ case ';': e = KeyEvent.KEYCODE_SEMICOLON; break;
+ case '\'': e = KeyEvent.KEYCODE_APOSTROPHE; break;
+ case '/': e = KeyEvent.KEYCODE_SLASH; break;
+ case '@': e = KeyEvent.KEYCODE_AT; break;
+ case '+': e = KeyEvent.KEYCODE_PLUS; break;
+ case ',': e = KeyEvent.KEYCODE_COMMA; break;
+ case '.': e = KeyEvent.KEYCODE_PERIOD; break;
+ case '*': e = KeyEvent.KEYCODE_STAR; break;
+ case '#': e = KeyEvent.KEYCODE_POUND; break;
+ case '(': e = KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN; break;
+ case ')': e = KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN; break;
+ case ' ': e = KeyEvent.KEYCODE_SPACE; break;
+ default: return k;
+ }
+ break;
+ case Editing:
+ switch (k.getEditing())
+ {
+ case SPACE_BAR: e = KeyEvent.KEYCODE_SPACE; break;
+ default: return k;
+ }
+ break;
default: return k;
}
return k.withKeyevent(e);
@@ -409,6 +432,12 @@ public final class KeyModifier
case KeyEvent.KEYCODE_FORWARD_DEL: name = "forward_delete_word"; break;
}
break;
+ case Editing:
+ switch (k.getEditing())
+ {
+ case BACKSPACE: name = "delete_word"; break;
+ }
+ break;
}
return (name == null) ? k : KeyValue.getKeyByName(name);
}
@@ -437,6 +466,12 @@ public final class KeyModifier
case KeyEvent.KEYCODE_ESCAPE: name = "selection_cancel"; break;
}
break;
+ case Editing:
+ switch (k.getEditing())
+ {
+ case SPACE_BAR: name = "selection_cancel"; break;
+ }
+ break;
}
return (name == null) ? k : KeyValue.getKeyByName(name);
}