aboutsummaryrefslogtreecommitdiff
path: root/keybind.c
blob: 986ec4c8aab37216fb75474df03235ad2d8690ad (plain)
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
#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;
}