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