diff options
| author | Riley Beckett <rbeckettvt@gmail.com> | 2025-10-26 19:55:26 -0400 |
|---|---|---|
| committer | Riley Beckett <rbeckettvt@gmail.com> | 2025-10-26 19:55:26 -0400 |
| commit | 500cd948a40a9ad2ee8e123254d66259c46464d6 (patch) | |
| tree | 8a0d1a8364fbf11d02e7df40ceb4b8081644e903 /keybind.c | |
| parent | 8003084ccf17b26e932b565cfc0bb30302af3dd7 (diff) | |
refactor keybinds
Diffstat (limited to 'keybind.c')
| -rw-r--r-- | keybind.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/keybind.c b/keybind.c new file mode 100644 index 0000000..986ec4c --- /dev/null +++ b/keybind.c @@ -0,0 +1,122 @@ +#include "keybind.h" +#include "array.h" +#include "input_field.h" + +key_repeat_t quit(client_state* state) { + state->running = false; + state->exit_code = EXIT_FAILURE; + return KEY_NO_REPEAT; +} + +key_repeat_t submit_line(client_state* state) { + if (state->exact_match) { + if (state->selected_filtered_item == -1) return false; + printf("%s\n", state->filtered_items[state->selected_filtered_item].item->text); + } + else { + if (state->selected_filtered_item == -1) printf("%.*s\n", (int)array_size(state->input_buffer), state->input_buffer); + else printf("%s\n", state->filtered_items[state->selected_filtered_item].item->text); + } + state->running = false; + state->exit_code = EXIT_SUCCESS; + return KEY_NO_REPEAT; +} + +key_repeat_t insert_selected(client_state* state) { + if (state->selected_filtered_item != -1) { + char* selected = state->filtered_items[state->selected_filtered_item].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); + state->cursor_index = len; + + update_text_buffer(state); + } + return KEY_NO_REPEAT; +} + +key_repeat_t select_next(client_state* state) { + if (state->selected_filtered_item != -1) { + state->selected_filtered_item = MIN(state->selected_filtered_item + 1, (int)array_size(state->filtered_items) - 1); + } + return KEY_REPEAT; +} + +key_repeat_t select_previous(client_state* state) { + if (state->selected_filtered_item != -1) { + state->selected_filtered_item = MAX(state->selected_filtered_item - 1, 0); + } + return KEY_REPEAT; +} + +key_repeat_t goto_end(client_state* state) { + state->cursor_index = array_size(state->input_buffer); + return KEY_NO_REPEAT; +} + +key_repeat_t goto_begining(client_state* state) { + state->cursor_index = 0; + return KEY_NO_REPEAT; +} + +key_repeat_t forward_char(client_state* state) { + if (state->cursor_index < array_size(state->input_buffer)) { + state->cursor_index++; + } + return KEY_REPEAT; +} + +key_repeat_t backward_char(client_state* state) { + if (state->cursor_index > 0) { + state->cursor_index--; + } + return KEY_REPEAT; +} + +key_repeat_t kill_to_end(client_state* state) { + array_resize(state->input_buffer, state->cursor_index); + update_text_buffer(state); + return KEY_NO_REPEAT; +} + +key_repeat_t delete_word(client_state* state) { + if (state->cursor_index != array_size(state->input_buffer)) { + size_t endidx = state->cursor_index; + for (; endidx < array_size(state->input_buffer) - 1; endidx++) { + if (state->input_buffer[endidx] == ' ') { + break; + } + } + array_erase_range(state->input_buffer, state->cursor_index, endidx); + update_text_buffer(state); + } + return KEY_REPEAT; +} + +key_repeat_t delete_char(client_state* state) { + if (state->cursor_index != array_size(state->input_buffer)) { + array_erase(state->input_buffer, state->cursor_index); + update_text_buffer(state); + return KEY_NO_REPEAT; + } + return KEY_REPEAT; +} + +key_repeat_t delete_char_backward(client_state* state) { + if (state->cursor_index) { + array_erase(state->input_buffer, state->cursor_index - 1); + state->cursor_index--; + update_text_buffer(state); + return KEY_REPEAT; + } + return KEY_NO_REPEAT; +} + +key_repeat_t clear_input(client_state* state) { + array_clear(state->input_buffer); + state->cursor_index = 0; + update_text_buffer(state); + return KEY_NO_REPEAT; +} |
