aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Jamison <jackqjamison@gmail.com>2025-10-18 01:08:56 -0400
committerJack Jamison <jackqjamison@gmail.com>2025-10-18 01:08:56 -0400
commit87338246fbf60e044f8aaba53032661c1796e0f9 (patch)
tree26654b1735b242e6db7f823df599e261b56494d3
parent69aa75b63cd86acf1b6001133d6f9b163033195d (diff)
completion
-rw-r--r--input_field.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/input_field.c b/input_field.c
index 0fbaca6..14aca1b 100644
--- a/input_field.c
+++ b/input_field.c
@@ -33,6 +33,7 @@ void update_text_buffer(client_state* state) {
bool type_key(client_state* state, xkb_keysym_t keysym) {
bool ctrl = xkb_state_mod_name_is_active(state->xkb_state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE);
+ bool alt = xkb_state_mod_name_is_active(state->xkb_state, XKB_MOD_NAME_ALT, XKB_STATE_MODS_EFFECTIVE);
// exit app
if ((keysym == XKB_KEY_c && ctrl) ||
@@ -43,14 +44,29 @@ bool type_key(client_state* state, xkb_keysym_t keysym) {
return false;
}
+ // complete
+ if ((keysym == XKB_KEY_i && ctrl && alt) || keysym == XKB_KEY_Tab) {
+ if (state->selected_filtered_item != -1) {
+ char* selected = state->items[state->filtered_items[state->selected_filtered_item]].text;
+ size_t len = strlen(selected);
+
+ array_free(state->input_buffer);
+ state->input_buffer = array_new(char, len);
+ memcpy(state->input_buffer, selected, len);
+
+ update_text_buffer(state);
+ }
+ return true;
+ }
+
// select next
- if (keysym == XKB_KEY_n && ctrl) {
+ if ((keysym == XKB_KEY_n && ctrl) || keysym == XKB_KEY_Right || keysym == XKB_KEY_Down) {
state->selected_filtered_item = MIN(state->selected_filtered_item + 1, array_size(state->filtered_items) - 1);
return true;
}
// select previous
- if (keysym == XKB_KEY_p && ctrl) {
+ if ((keysym == XKB_KEY_p && ctrl) || keysym == XKB_KEY_Left || keysym == XKB_KEY_Up) {
state->selected_filtered_item = MAX(state->selected_filtered_item - 1, 0);
return true;
}
@@ -88,8 +104,10 @@ bool type_key(client_state* state, xkb_keysym_t keysym) {
}
void submit_line(client_state* state) {
- if (state->input_buffer) {
+ if (state->selected_filtered_item == -1) {
printf("%.*s\n", (int)array_size(state->input_buffer), state->input_buffer);
- state->running = false;
+ } else {
+ printf("%s\n", state->items[state->filtered_items[state->selected_filtered_item]].text);
}
+ state->running = false;
}