2 * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #include "telescope.h"
23 #define CTRL(n) ((n)&0x1F)
25 static struct keytable {
30 { "<down>", KEY_DOWN },
31 { "<left>", KEY_LEFT },
32 { "<right>", KEY_RIGHT },
33 { "<prior>", KEY_PPAGE },
34 { "<next>", KEY_NPAGE },
35 { "<home>", KEY_HOME },
38 { "del", KEY_BACKSPACE },
42 { "enter", CTRL('m') },
54 for (t = keytable; t->p != NULL; ++t) {
55 if (has_prefix(key, t->p))
67 for (t = keytable; t->p != NULL; ++t) {
76 kmap_define_key(struct kmap *map, const char *key, void (*fn)(struct tab*))
82 if ((ctrl = has_prefix(key, "C-")))
84 if ((meta = has_prefix(key, "M-")))
93 /* skip key & spaces */
94 while (*key != '\0' && !isspace(*key))
96 while (*key != '\0' && isspace(*key))
99 TAILQ_FOREACH(entry, &map->m, keymaps) {
100 if (entry->meta == meta && entry->key == k) {
110 if ((entry = calloc(1, sizeof(*entry))) == NULL)
115 TAILQ_INIT(&entry->map.m);
117 if (TAILQ_EMPTY(&map->m))
118 TAILQ_INSERT_HEAD(&map->m, entry, keymaps);
120 TAILQ_INSERT_TAIL(&map->m, entry, keymaps);