Blame


1 67c8ed7f 2021-03-13 op /*
2 67c8ed7f 2021-03-13 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 67c8ed7f 2021-03-13 op *
4 67c8ed7f 2021-03-13 op * Permission to use, copy, modify, and distribute this software for any
5 67c8ed7f 2021-03-13 op * purpose with or without fee is hereby granted, provided that the above
6 67c8ed7f 2021-03-13 op * copyright notice and this permission notice appear in all copies.
7 67c8ed7f 2021-03-13 op *
8 67c8ed7f 2021-03-13 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 67c8ed7f 2021-03-13 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 67c8ed7f 2021-03-13 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 67c8ed7f 2021-03-13 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 67c8ed7f 2021-03-13 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 67c8ed7f 2021-03-13 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 67c8ed7f 2021-03-13 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 67c8ed7f 2021-03-13 op */
16 67c8ed7f 2021-03-13 op
17 786e6deb 2021-07-21 op #include "compat.h"
18 67c8ed7f 2021-03-13 op
19 67c8ed7f 2021-03-13 op #include <ctype.h>
20 67c8ed7f 2021-03-13 op #include <curses.h>
21 67c8ed7f 2021-03-13 op #include <stdlib.h>
22 67c8ed7f 2021-03-13 op
23 b7d58e0b 2021-11-05 op #include "keymap.h"
24 786e6deb 2021-07-21 op #include "telescope.h"
25 9d65b1d9 2022-01-11 op #include "utils.h"
26 786e6deb 2021-07-21 op
27 67c8ed7f 2021-03-13 op #define CTRL(n) ((n)&0x1F)
28 67c8ed7f 2021-03-13 op
29 0a5a10e8 2021-03-13 op static struct keytable {
30 754622a2 2021-03-15 op const char *p;
31 754622a2 2021-03-15 op int k;
32 67c8ed7f 2021-03-13 op } keytable[] = {
33 67c8ed7f 2021-03-13 op { "<up>", KEY_UP },
34 67c8ed7f 2021-03-13 op { "<down>", KEY_DOWN },
35 67c8ed7f 2021-03-13 op { "<left>", KEY_LEFT },
36 67c8ed7f 2021-03-13 op { "<right>", KEY_RIGHT },
37 67c8ed7f 2021-03-13 op { "<prior>", KEY_PPAGE },
38 67c8ed7f 2021-03-13 op { "<next>", KEY_NPAGE },
39 67c8ed7f 2021-03-13 op { "<home>", KEY_HOME },
40 67c8ed7f 2021-03-13 op { "<end>", KEY_END },
41 67c8ed7f 2021-03-13 op /* ... */
42 4c44f8c0 2021-03-15 op { "<f0>", KEY_F(0) },
43 4c44f8c0 2021-03-15 op { "<f1>", KEY_F(1) },
44 4c44f8c0 2021-03-15 op { "<f2>", KEY_F(2) },
45 4c44f8c0 2021-03-15 op { "<f3>", KEY_F(3) },
46 4c44f8c0 2021-03-15 op { "<f4>", KEY_F(4) },
47 4c44f8c0 2021-03-15 op { "<f5>", KEY_F(5) },
48 4c44f8c0 2021-03-15 op { "<f6>", KEY_F(6) },
49 4c44f8c0 2021-03-15 op { "<f7>", KEY_F(7) },
50 4c44f8c0 2021-03-15 op { "<f8>", KEY_F(8) },
51 4c44f8c0 2021-03-15 op { "<f9>", KEY_F(9) },
52 4c44f8c0 2021-03-15 op { "<f10>", KEY_F(10) },
53 4c44f8c0 2021-03-15 op { "<f11>", KEY_F(11) },
54 4c44f8c0 2021-03-15 op { "<f12>", KEY_F(12) },
55 4c44f8c0 2021-03-15 op { "<f13>", KEY_F(13) },
56 4c44f8c0 2021-03-15 op { "<f14>", KEY_F(14) },
57 4c44f8c0 2021-03-15 op { "<f15>", KEY_F(15) },
58 4c44f8c0 2021-03-15 op { "<f16>", KEY_F(16) },
59 4c44f8c0 2021-03-15 op { "<f17>", KEY_F(17) },
60 4c44f8c0 2021-03-15 op { "<f18>", KEY_F(18) },
61 4c44f8c0 2021-03-15 op { "<f19>", KEY_F(19) },
62 4c44f8c0 2021-03-15 op { "<f20>", KEY_F(20) },
63 4c44f8c0 2021-03-15 op { "<f21>", KEY_F(21) },
64 4c44f8c0 2021-03-15 op { "<f22>", KEY_F(22) },
65 4c44f8c0 2021-03-15 op { "<f23>", KEY_F(23) },
66 4c44f8c0 2021-03-15 op { "<f24>", KEY_F(24) },
67 4c44f8c0 2021-03-15 op { "<f25>", KEY_F(25) },
68 4c44f8c0 2021-03-15 op { "<f26>", KEY_F(26) },
69 4c44f8c0 2021-03-15 op { "<f27>", KEY_F(27) },
70 4c44f8c0 2021-03-15 op { "<f28>", KEY_F(28) },
71 4c44f8c0 2021-03-15 op { "<f29>", KEY_F(29) },
72 4c44f8c0 2021-03-15 op { "<f30>", KEY_F(30) },
73 4c44f8c0 2021-03-15 op { "<f31>", KEY_F(31) },
74 4c44f8c0 2021-03-15 op { "<f32>", KEY_F(32) },
75 4c44f8c0 2021-03-15 op { "<f33>", KEY_F(33) },
76 4c44f8c0 2021-03-15 op { "<f34>", KEY_F(34) },
77 4c44f8c0 2021-03-15 op { "<f35>", KEY_F(35) },
78 4c44f8c0 2021-03-15 op { "<f36>", KEY_F(36) },
79 4c44f8c0 2021-03-15 op { "<f37>", KEY_F(37) },
80 4c44f8c0 2021-03-15 op { "<f38>", KEY_F(38) },
81 4c44f8c0 2021-03-15 op { "<f39>", KEY_F(39) },
82 4c44f8c0 2021-03-15 op { "<f40>", KEY_F(40) },
83 4c44f8c0 2021-03-15 op { "<f41>", KEY_F(41) },
84 4c44f8c0 2021-03-15 op { "<f42>", KEY_F(42) },
85 4c44f8c0 2021-03-15 op { "<f43>", KEY_F(43) },
86 4c44f8c0 2021-03-15 op { "<f44>", KEY_F(44) },
87 4c44f8c0 2021-03-15 op { "<f45>", KEY_F(45) },
88 4c44f8c0 2021-03-15 op { "<f46>", KEY_F(46) },
89 4c44f8c0 2021-03-15 op { "<f47>", KEY_F(47) },
90 4c44f8c0 2021-03-15 op { "<f48>", KEY_F(48) },
91 4c44f8c0 2021-03-15 op { "<f49>", KEY_F(49) },
92 4c44f8c0 2021-03-15 op { "<f50>", KEY_F(50) },
93 4c44f8c0 2021-03-15 op { "<f51>", KEY_F(51) },
94 4c44f8c0 2021-03-15 op { "<f52>", KEY_F(52) },
95 4c44f8c0 2021-03-15 op { "<f53>", KEY_F(53) },
96 4c44f8c0 2021-03-15 op { "<f54>", KEY_F(54) },
97 4c44f8c0 2021-03-15 op { "<f55>", KEY_F(55) },
98 4c44f8c0 2021-03-15 op { "<f56>", KEY_F(56) },
99 4c44f8c0 2021-03-15 op { "<f57>", KEY_F(57) },
100 4c44f8c0 2021-03-15 op { "<f58>", KEY_F(58) },
101 4c44f8c0 2021-03-15 op { "<f59>", KEY_F(59) },
102 4c44f8c0 2021-03-15 op { "<f60>", KEY_F(60) },
103 4c44f8c0 2021-03-15 op { "<f61>", KEY_F(61) },
104 4c44f8c0 2021-03-15 op { "<f62>", KEY_F(62) },
105 4c44f8c0 2021-03-15 op { "<f63>", KEY_F(63) },
106 4c44f8c0 2021-03-15 op /* ... */
107 67c8ed7f 2021-03-13 op { "del", KEY_BACKSPACE },
108 3c066721 2021-03-26 op { "backspace", 127 },
109 3f66a33e 2021-12-01 op { "esc", '\e' },
110 67c8ed7f 2021-03-13 op { "space", ' ' },
111 67c8ed7f 2021-03-13 op { "spc", ' ' },
112 67c8ed7f 2021-03-13 op { "enter", CTRL('m') },
113 67c8ed7f 2021-03-13 op { "ret", CTRL('m' )},
114 67c8ed7f 2021-03-13 op { "tab", CTRL('i') },
115 8dc60352 2021-06-15 op { "backtab", KEY_BTAB },
116 67c8ed7f 2021-03-13 op /* ... */
117 67c8ed7f 2021-03-13 op { NULL, 0 },
118 67c8ed7f 2021-03-13 op };
119 67c8ed7f 2021-03-13 op
120 67c8ed7f 2021-03-13 op int
121 67c8ed7f 2021-03-13 op kbd(const char *key)
122 67c8ed7f 2021-03-13 op {
123 67c8ed7f 2021-03-13 op struct keytable *t;
124 67c8ed7f 2021-03-13 op
125 67c8ed7f 2021-03-13 op for (t = keytable; t->p != NULL; ++t) {
126 67c8ed7f 2021-03-13 op if (has_prefix(key, t->p))
127 67c8ed7f 2021-03-13 op return t->k;
128 67c8ed7f 2021-03-13 op }
129 67c8ed7f 2021-03-13 op
130 67c8ed7f 2021-03-13 op return *key;
131 67c8ed7f 2021-03-13 op }
132 67c8ed7f 2021-03-13 op
133 67c8ed7f 2021-03-13 op const char *
134 67c8ed7f 2021-03-13 op unkbd(int k)
135 67c8ed7f 2021-03-13 op {
136 67c8ed7f 2021-03-13 op struct keytable *t;
137 67c8ed7f 2021-03-13 op
138 67c8ed7f 2021-03-13 op for (t = keytable; t->p != NULL; ++t) {
139 67c8ed7f 2021-03-13 op if (k == t->k)
140 67c8ed7f 2021-03-13 op return t->p;
141 67c8ed7f 2021-03-13 op }
142 67c8ed7f 2021-03-13 op
143 67c8ed7f 2021-03-13 op return NULL;
144 67c8ed7f 2021-03-13 op }
145 67c8ed7f 2021-03-13 op
146 67c8ed7f 2021-03-13 op int
147 46f6e974 2021-05-17 op kmap_define_key(struct kmap *map, const char *key, void (*fn)(struct buffer*))
148 67c8ed7f 2021-03-13 op {
149 67c8ed7f 2021-03-13 op int ctrl, meta, k;
150 67c8ed7f 2021-03-13 op struct keymap *entry;
151 67c8ed7f 2021-03-13 op
152 67c8ed7f 2021-03-13 op again:
153 67c8ed7f 2021-03-13 op if ((ctrl = has_prefix(key, "C-")))
154 67c8ed7f 2021-03-13 op key += 2;
155 67c8ed7f 2021-03-13 op if ((meta = has_prefix(key, "M-")))
156 67c8ed7f 2021-03-13 op key += 2;
157 67c8ed7f 2021-03-13 op if (*key == '\0')
158 67c8ed7f 2021-03-13 op return 0;
159 67c8ed7f 2021-03-13 op k = kbd(key);
160 67c8ed7f 2021-03-13 op
161 67c8ed7f 2021-03-13 op if (ctrl)
162 67c8ed7f 2021-03-13 op k = CTRL(k);
163 67c8ed7f 2021-03-13 op
164 67c8ed7f 2021-03-13 op /* skip key & spaces */
165 67c8ed7f 2021-03-13 op while (*key != '\0' && !isspace(*key))
166 67c8ed7f 2021-03-13 op ++key;
167 67c8ed7f 2021-03-13 op while (*key != '\0' && isspace(*key))
168 67c8ed7f 2021-03-13 op ++key;
169 67c8ed7f 2021-03-13 op
170 67c8ed7f 2021-03-13 op TAILQ_FOREACH(entry, &map->m, keymaps) {
171 67c8ed7f 2021-03-13 op if (entry->meta == meta && entry->key == k) {
172 67c8ed7f 2021-03-13 op if (*key == '\0') {
173 67c8ed7f 2021-03-13 op entry->fn = fn;
174 67c8ed7f 2021-03-13 op return 1;
175 67c8ed7f 2021-03-13 op }
176 67c8ed7f 2021-03-13 op map = &entry->map;
177 67c8ed7f 2021-03-13 op goto again;
178 67c8ed7f 2021-03-13 op }
179 67c8ed7f 2021-03-13 op }
180 67c8ed7f 2021-03-13 op
181 67c8ed7f 2021-03-13 op if ((entry = calloc(1, sizeof(*entry))) == NULL)
182 67c8ed7f 2021-03-13 op return 0;
183 67c8ed7f 2021-03-13 op
184 67c8ed7f 2021-03-13 op entry->meta = meta;
185 67c8ed7f 2021-03-13 op entry->key = k;
186 67c8ed7f 2021-03-13 op TAILQ_INIT(&entry->map.m);
187 67c8ed7f 2021-03-13 op
188 32ac17a4 2021-08-12 op TAILQ_INSERT_TAIL(&map->m, entry, keymaps);
189 67c8ed7f 2021-03-13 op
190 67c8ed7f 2021-03-13 op if (*key != '\0') {
191 67c8ed7f 2021-03-13 op map = &entry->map;
192 67c8ed7f 2021-03-13 op goto again;
193 67c8ed7f 2021-03-13 op }
194 67c8ed7f 2021-03-13 op
195 67c8ed7f 2021-03-13 op entry->fn = fn;
196 67c8ed7f 2021-03-13 op
197 67c8ed7f 2021-03-13 op return 1;
198 67c8ed7f 2021-03-13 op }
199 67c8ed7f 2021-03-13 op
200 57668c86 2021-11-05 op int
201 57668c86 2021-11-05 op lookup_key(struct kmap **map, struct thiskey *key, struct buffer *buf)
202 57668c86 2021-11-05 op {
203 57668c86 2021-11-05 op struct keymap *k;
204 57668c86 2021-11-05 op
205 57668c86 2021-11-05 op TAILQ_FOREACH(k, &(*map)->m, keymaps) {
206 57668c86 2021-11-05 op if (k->meta == key->meta &&
207 57668c86 2021-11-05 op k->key == key->key) {
208 57668c86 2021-11-05 op if (k->fn == NULL) {
209 57668c86 2021-11-05 op *map = &k->map;
210 57668c86 2021-11-05 op return LK_ADVANCED_MAP;
211 57668c86 2021-11-05 op } else {
212 57668c86 2021-11-05 op k->fn(buf);
213 57668c86 2021-11-05 op return LK_MATCHED;
214 57668c86 2021-11-05 op }
215 57668c86 2021-11-05 op }
216 57668c86 2021-11-05 op }
217 57668c86 2021-11-05 op
218 57668c86 2021-11-05 op return LK_UNBOUND;
219 57668c86 2021-11-05 op }