1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#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);
update_layout(state);
}
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);
update_layout(state);
}
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;
}
|