aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd-list-keys.c10
-rw-r--r--cmd-queue.c2
-rw-r--r--cmd-send-keys.c4
-rw-r--r--input-keys.c91
-rw-r--r--key-bindings.c4
-rw-r--r--key-string.c47
-rw-r--r--menu.c2
-rw-r--r--mode-tree.c2
-rw-r--r--options.c4
-rw-r--r--popup.c2
-rw-r--r--server-client.c4
-rw-r--r--status.c4
-rw-r--r--tmux.h36
-rw-r--r--tty-keys.c264
-rw-r--r--window-customize.c8
-rw-r--r--window.c6
16 files changed, 264 insertions, 226 deletions
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index 60ef73af..51c90dfe 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -73,7 +73,7 @@ cmd_list_keys_get_width(const char *tablename, key_code only)
bd = key_bindings_next(table, bd);
continue;
}
- width = utf8_cstrwidth(key_string_lookup_key(bd->key));
+ width = utf8_cstrwidth(key_string_lookup_key(bd->key, 0));
if (width > keywidth)
keywidth = width;
@@ -106,7 +106,7 @@ cmd_list_keys_print_notes(struct cmdq_item *item, struct args *args,
continue;
}
found = 1;
- key = key_string_lookup_key(bd->key);
+ key = key_string_lookup_key(bd->key, 0);
if (bd->note == NULL || *bd->note == '\0')
note = cmd_list_print(bd->cmdlist, 1);
@@ -135,7 +135,7 @@ cmd_list_keys_get_prefix(struct args *args, key_code *prefix)
*prefix = options_get_number(global_s_options, "prefix");
if (!args_has(args, 'P')) {
if (*prefix != KEYC_NONE)
- xasprintf(&s, "%s ", key_string_lookup_key(*prefix));
+ xasprintf(&s, "%s ", key_string_lookup_key(*prefix, 0));
else
s = xstrdup("");
} else
@@ -221,7 +221,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
bd = key_bindings_next(table, bd);
continue;
}
- key = args_escape(key_string_lookup_key(bd->key));
+ key = args_escape(key_string_lookup_key(bd->key, 0));
if (bd->flags & KEY_BINDING_REPEAT)
repeat = 1;
@@ -255,7 +255,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
continue;
}
found = 1;
- key = args_escape(key_string_lookup_key(bd->key));
+ key = args_escape(key_string_lookup_key(bd->key, 0));
if (!repeat)
r = "";
diff --git a/cmd-queue.c b/cmd-queue.c
index 5620fdad..b0c70428 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -547,7 +547,7 @@ cmdq_add_message(struct cmdq_item *item)
if (c != NULL) {
name = c->name;
if (c->session != NULL && state->event.key != KEYC_NONE) {
- key = key_string_lookup_key(state->event.key);
+ key = key_string_lookup_key(state->event.key, 0);
server_add_message("%s key %s: %s", name, key, tmp);
} else
server_add_message("%s command: %s", name, tmp);
diff --git a/cmd-send-keys.c b/cmd-send-keys.c
index 27ca8a63..a9ecc807 100644
--- a/cmd-send-keys.c
+++ b/cmd-send-keys.c
@@ -71,13 +71,13 @@ cmd_send_keys_inject_key(struct cmdq_item *item, struct cmdq_item *after,
wme = TAILQ_FIRST(&wp->modes);
if (wme == NULL || wme->mode->key_table == NULL) {
- if (window_pane_key(wp, tc, s, wl, key|KEYC_XTERM, NULL) != 0)
+ if (window_pane_key(wp, tc, s, wl, key, NULL) != 0)
return (NULL);
return (item);
}
table = key_bindings_get_table(wme->mode->key_table(wme), 1);
- bd = key_bindings_get(table, key & ~KEYC_XTERM);
+ bd = key_bindings_get(table, key & ~KEYC_MASK_FLAGS);
if (bd != NULL) {
table->references++;
after = key_bindings_dispatch(bd, after, tc, NULL, target);
diff --git a/input-keys.c b/input-keys.c
index 7f2bc7d8..ef6caa31 100644
--- a/input-keys.c
+++ b/input-keys.c
@@ -265,82 +265,82 @@ static struct input_key_entry input_key_defaults[] = {
},
/* Keys with an embedded modifier. */
- { .key = KEYC_F1|KEYC_XTERM,
+ { .key = KEYC_F1|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_P"
},
- { .key = KEYC_F2|KEYC_XTERM,
+ { .key = KEYC_F2|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_Q"
},
- { .key = KEYC_F3|KEYC_XTERM,
+ { .key = KEYC_F3|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_R"
},
- { .key = KEYC_F4|KEYC_XTERM,
+ { .key = KEYC_F4|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_S"
},
- { .key = KEYC_F5|KEYC_XTERM,
+ { .key = KEYC_F5|KEYC_BUILD_MODIFIERS,
.data = "\033[15;_~"
},
- { .key = KEYC_F6|KEYC_XTERM,
+ { .key = KEYC_F6|KEYC_BUILD_MODIFIERS,
.data = "\033[17;_~"
},
- { .key = KEYC_F7|KEYC_XTERM,
+ { .key = KEYC_F7|KEYC_BUILD_MODIFIERS,
.data = "\033[18;_~"
},
- { .key = KEYC_F8|KEYC_XTERM,
+ { .key = KEYC_F8|KEYC_BUILD_MODIFIERS,
.data = "\033[19;_~"
},
- { .key = KEYC_F9|KEYC_XTERM,
+ { .key = KEYC_F9|KEYC_BUILD_MODIFIERS,
.data = "\033[20;_~"
},
- { .key = KEYC_F10|KEYC_XTERM,
+ { .key = KEYC_F10|KEYC_BUILD_MODIFIERS,
.data = "\033[21;_~"
},
- { .key = KEYC_F11|KEYC_XTERM,
+ { .key = KEYC_F11|KEYC_BUILD_MODIFIERS,
.data = "\033[23;_~"
},
- { .key = KEYC_F12|KEYC_XTERM,
+ { .key = KEYC_F12|KEYC_BUILD_MODIFIERS,
.data = "\033[24;_~"
},
- { .key = KEYC_UP|KEYC_XTERM,
+ { .key = KEYC_UP|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_A"
},
- { .key = KEYC_DOWN|KEYC_XTERM,
+ { .key = KEYC_DOWN|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_B"
},
- { .key = KEYC_RIGHT|KEYC_XTERM,
+ { .key = KEYC_RIGHT|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_C"
},
- { .key = KEYC_LEFT|KEYC_XTERM,
+ { .key = KEYC_LEFT|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_D"
},
- { .key = KEYC_HOME|KEYC_XTERM,
+ { .key = KEYC_HOME|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_H"
},
- { .key = KEYC_END|KEYC_XTERM,
+ { .key = KEYC_END|KEYC_BUILD_MODIFIERS,
.data = "\033[1;_F"
},
- { .key = KEYC_PPAGE|KEYC_XTERM,
+ { .key = KEYC_PPAGE|KEYC_BUILD_MODIFIERS,
.data = "\033[5;_~"
},
- { .key = KEYC_NPAGE|KEYC_XTERM,
+ { .key = KEYC_NPAGE|KEYC_BUILD_MODIFIERS,
.data = "\033[6;_~"
},
- { .key = KEYC_IC|KEYC_XTERM,
+ { .key = KEYC_IC|KEYC_BUILD_MODIFIERS,
.data = "\033[2;_~"
},
- { .key = KEYC_DC|KEYC_XTERM,
+ { .key = KEYC_DC|KEYC_BUILD_MODIFIERS,
.data = "\033[3;_~" }
};
static const key_code input_key_modifiers[] = {
0,
0,
- KEYC_SHIFT|KEYC_XTERM,
- KEYC_META|KEYC_XTERM,
- KEYC_SHIFT|KEYC_META|KEYC_XTERM,
- KEYC_CTRL|KEYC_XTERM,
- KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM,
- KEYC_META|KEYC_CTRL|KEYC_XTERM,
- KEYC_SHIFT|KEYC_META|KEYC_CTRL|KEYC_XTERM
+ KEYC_SHIFT,
+ KEYC_META|KEYC_IMPLIED_META,
+ KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META,
+ KEYC_CTRL,
+ KEYC_SHIFT|KEYC_CTRL,
+ KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL,
+ KEYC_SHIFT|KEYC_META|KEYC_CTRL
};
/* Input key comparison function. */
@@ -354,6 +354,15 @@ input_key_cmp(struct input_key_entry *ike1, struct input_key_entry *ike2)
return (0);
}
+/* Look for key in tree. */
+static struct input_key_entry *
+input_key_get (key_code key)
+{
+ struct input_key_entry entry = { .key = key };
+
+ return (RB_FIND(input_key_tree, &input_key_tree, &entry));
+}
+
/* Split a character into two UTF-8 bytes. */
static size_t
input_key_split2(u_int c, u_char *dst)
@@ -374,20 +383,22 @@ input_key_build(void)
struct input_key_entry *ike, *new;
u_int i, j;
char *data;
+ key_code key;
for (i = 0; i < nitems(input_key_defaults); i++) {
ike = &input_key_defaults[i];
- if (~ike->key & KEYC_XTERM) {
+ if (~ike->key & KEYC_BUILD_MODIFIERS) {
RB_INSERT(input_key_tree, &input_key_tree, ike);
continue;
}
for (j = 2; j < nitems(input_key_modifiers); j++) {
+ key = (ike->key & ~KEYC_BUILD_MODIFIERS);
data = xstrdup(ike->data);
data[strcspn(data, "_")] = '0' + j;
new = xcalloc(1, sizeof *new);
- new->key = ike->key|input_key_modifiers[j];
+ new->key = key|input_key_modifiers[j];
new->data = data;
RB_INSERT(input_key_tree, &input_key_tree, new);
}
@@ -395,7 +406,7 @@ input_key_build(void)
RB_FOREACH(ike, input_key_tree, &input_key_tree) {
log_debug("%s: 0x%llx (%s) is %s", __func__, ike->key,
- key_string_lookup_key(ike->key), ike->data);
+ key_string_lookup_key(ike->key, 1), ike->data);
}
}
@@ -405,7 +416,7 @@ input_key_pane(struct window_pane *wp, key_code key, struct mouse_event *m)
{
if (log_get_level() != 0) {
log_debug("writing key 0x%llx (%s) to %%%u", key,
- key_string_lookup_key(key), wp->id);
+ key_string_lookup_key(key, 1), wp->id);
}
if (KEYC_IS_MOUSE(key)) {
@@ -420,7 +431,7 @@ input_key_pane(struct window_pane *wp, key_code key, struct mouse_event *m)
int
input_key(struct screen *s, struct bufferevent *bev, key_code key)
{
- struct input_key_entry *ike, entry;
+ struct input_key_entry *ike;
size_t datalen;
key_code justkey, newkey;
struct utf8_data ud;
@@ -441,14 +452,14 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
newkey = options_get_number(global_options, "backspace");
if (newkey >= 0x7f)
newkey = '\177';
- key = newkey|(key & KEYC_MASK_MOD);
+ key = newkey|(key & (KEYC_MASK_MODIFIERS|KEYC_MASK_FLAGS));
}
/*
* If this is a normal 7-bit key, just send it, with a leading escape
* if necessary. If it is a UTF-8 key, split it and send it.
*/
- justkey = (key & ~(KEYC_XTERM|KEYC_META));
+ justkey = (key & ~KEYC_META);
if (justkey <= 0x7f) {
if (key & KEYC_META)
bufferevent_write(bev, "\033", 1);
@@ -473,8 +484,10 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
key &= ~KEYC_KEYPAD;
if (~s->mode & MODE_KCURSOR)
key &= ~KEYC_CURSOR;
- entry.key = key;
- if ((ike = RB_FIND(input_key_tree, &input_key_tree, &entry)) == NULL) {
+ ike = input_key_get(key);
+ if (ike == NULL && (key & KEYC_META) && (~key & KEYC_IMPLIED_META))
+ ike = input_key_get(key & ~KEYC_META);
+ if (ike == NULL) {
log_debug("key 0x%llx missing", key);
return (-1);
}
@@ -482,7 +495,7 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
log_debug("found key 0x%llx: \"%s\"", key, ike->data);
/* Prefix a \033 for escape. */
- if (key & KEYC_META)
+ if (key & KEYC_META && (~key & KEYC_IMPLIED_META))
bufferevent_write(bev, "\033", 1);
bufferevent_write(bev, ike->data, datalen);
return (0);
diff --git a/key-bindings.c b/key-bindings.c
index 05089bab..59cfbb0d 100644
--- a/key-bindings.c
+++ b/key-bindings.c
@@ -190,7 +190,7 @@ key_bindings_add(const char *name, key_code key, const char *note, int repeat,
table = key_bindings_get_table(name, 1);
- bd = key_bindings_get(table, key & ~KEYC_XTERM);
+ bd = key_bindings_get(table, key & ~KEYC_MASK_FLAGS);
if (bd != NULL) {
RB_REMOVE(key_bindings, &table->key_bindings, bd);
key_bindings_free(bd);
@@ -217,7 +217,7 @@ key_bindings_remove(const char *name, key_code key)
if (table == NULL)
return;
- bd = key_bindings_get(table, key & ~KEYC_XTERM);
+ bd = key_bindings_get(table, key & ~KEYC_MASK_FLAGS);
if (bd == NULL)
return;
diff --git a/key-string.c b/key-string.c
index bd98ca69..65f1afe5 100644
--- a/key-string.c
+++ b/key-string.c
@@ -212,7 +212,7 @@ key_string_lookup_string(const char *string)
return (KEYC_UNKNOWN);
if (utf8_combine(&ud, &wc) != UTF8_DONE)
return (KEYC_UNKNOWN);
- return (wc | modifiers);
+ return (wc|modifiers);
}
/* Otherwise look the key up in the table. */
@@ -236,14 +236,15 @@ key_string_lookup_string(const char *string)
modifiers &= ~KEYC_CTRL;
}
- return (key | modifiers);
+ return (key|modifiers);
}
/* Convert a key code into string format, with prefix if necessary. */
const char *
-key_string_lookup_key(key_code key)
+key_string_lookup_key(key_code key, int with_flags)
{
- static char out[32];
+ key_code saved = key;
+ static char out[64];
char tmp[8];
const char *s;
u_int i;
@@ -255,12 +256,12 @@ key_string_lookup_key(key_code key)
/* Literal keys are themselves. */
if (key & KEYC_LITERAL) {
snprintf(out, sizeof out, "%c", (int)(key & 0xff));
- return (out);
+ goto out;
}
/* Display C-@ as C-Space. */
- if ((key & KEYC_MASK_KEY) == 0)
- key = ' ' | KEYC_CTRL | (key & KEYC_MASK_MOD);
+ if ((key & (KEYC_MASK_KEY|KEYC_MASK_MODIFIERS)) == 0)
+ key = ' '|KEYC_CTRL;
/* Fill in the modifiers. */
if (key & KEYC_CTRL)
@@ -272,8 +273,10 @@ key_string_lookup_key(key_code key)
key &= KEYC_MASK_KEY;
/* Handle no key. */
- if (key == KEYC_NONE)
- return ("None");
+ if (key == KEYC_NONE) {
+ s = "None";
+ goto append;
+ }
/* Handle special keys. */
if (key == KEYC_UNKNOWN) {
@@ -331,7 +334,7 @@ key_string_lookup_key(key_code key)
if (key >= KEYC_USER && key < KEYC_USER + KEYC_NUSER) {
snprintf(tmp, sizeof tmp, "User%u", (u_int)(key - KEYC_USER));
strlcat(out, tmp, sizeof out);
- return (out);
+ goto out;
}
/* Try the key against the string table. */
@@ -341,7 +344,7 @@ key_string_lookup_key(key_code key)
}
if (i != nitems(key_string_table)) {
strlcat(out, key_string_table[i].string, sizeof out);
- return (out);
+ goto out;
}
/* Is this a UTF-8 key? */
@@ -350,14 +353,14 @@ key_string_lookup_key(key_code key)
off = strlen(out);
memcpy(out + off, ud.data, ud.size);
out[off + ud.size] = '\0';
- return (out);
+ goto out;
}
}
/* Invalid keys are errors. */
if (key > 255) {
snprintf(out, sizeof out, "Invalid#%llx", key);
- return (out);
+ goto out;
}
/* Check for standard or control key. */
@@ -375,9 +378,25 @@ key_string_lookup_key(key_code key)
xsnprintf(tmp, sizeof tmp, "\\%llo", key);
strlcat(out, tmp, sizeof out);
- return (out);
+ goto out;
append:
strlcat(out, s, sizeof out);
+
+out:
+ if (with_flags && (saved & KEYC_MASK_FLAGS) != 0) {
+ strlcat(out, "[", sizeof out);
+ if (saved & KEYC_LITERAL)
+ strlcat(out, "L", sizeof out);
+ if (saved & KEYC_KEYPAD)
+ strlcat(out, "K", sizeof out);
+ if (saved & KEYC_CURSOR)
+ strlcat(out, "C", sizeof out);
+ if (saved & KEYC_IMPLIED_META)
+ strlcat(out, "I", sizeof out);
+ if (saved & KEYC_BUILD_MODIFIERS)
+ strlcat(out, "B", sizeof out);
+ strlcat(out, "]", sizeof out);
+ }
return (out);
}
diff --git a/menu.c b/menu.c
index 62010a58..1969cef4 100644
--- a/menu.c
+++ b/menu.c
@@ -81,7 +81,7 @@ menu_add_item(struct menu *menu, const struct menu_item *item,
return;
}
if (*s != '-' && item->key != KEYC_UNKNOWN && item->key != KEYC_NONE) {
- key = key_string_lookup_key(item->key);
+ key = key_string_lookup_key(item->key, 0);
xasprintf(&name, "%s#[default] #[align=right](%s)", s, key);
} else
xasprintf(&name, "%s", s);
diff --git a/mode-tree.c b/mode-tree.c
index 03738d56..993070ec 100644
--- a/mode-tree.c
+++ b/mode-tree.c
@@ -987,7 +987,7 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
choice = -1;
if (*key >= '0' && *key <= '9')
choice = (*key) - '0';
- else if (((*key) & KEYC_MASK_MOD) == KEYC_META) {
+ else if (((*key) & KEYC_MASK_MODIFIERS) == KEYC_META) {
tmp = (*key) & KEYC_MASK_KEY;
if (tmp >= 'a' && tmp <= 'z')
choice = 10 + (tmp - 'a');
diff --git a/options.c b/options.c
index 22e1be7e..5685cb51 100644
--- a/options.c
+++ b/options.c
@@ -129,7 +129,7 @@ options_value_to_string(struct options_entry *o, union options_value *ov,
xasprintf(&s, "%lld", ov->number);
break;
case OPTIONS_TABLE_KEY:
- s = xstrdup(key_string_lookup_key(ov->number));
+ s = xstrdup(key_string_lookup_key(ov->number, 0));
break;
case OPTIONS_TABLE_COLOUR:
s = xstrdup(colour_tostring(ov->number));
@@ -282,7 +282,7 @@ options_default_to_string(const struct options_table_entry *oe)
xasprintf(&s, "%lld", oe->default_num);
break;
case OPTIONS_TABLE_KEY:
- s = xstrdup(key_string_lookup_key(oe->default_num));
+ s = xstrdup(key_string_lookup_key(oe->default_num, 0));
break;
case OPTIONS_TABLE_COLOUR:
s = xstrdup(colour_tostring(oe->default_num));
diff --git a/popup.c b/popup.c
index 8d88c99f..6f2ab101 100644
--- a/popup.c
+++ b/popup.c
@@ -340,7 +340,7 @@ popup_key_cb(struct client *c, struct key_event *event)
format_defaults(ft, c, fs->s, fs->wl, fs->wp);
else
format_defaults(ft, c, NULL, NULL, NULL);
- format_add(ft, "popup_key", "%s", key_string_lookup_key(event->key));
+ format_add(ft, "popup_key", "%s", key_string_lookup_key(event->key, 0));
if (KEYC_IS_MOUSE(event->key)) {
format_add(ft, "popup_mouse", "1");
format_add(ft, "popup_mouse_x", "%u", m->x - pd->px);
diff --git a/server-client.c b/server-client.c
index 9631a7de..87a4f533 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1040,7 +1040,7 @@ out:
key |= KEYC_SHIFT;
if (log_get_level() != 0)
- log_debug("mouse key is %s", key_string_lookup_key (key));
+ log_debug("mouse key is %s", key_string_lookup_key (key, 1));
return (key);
}
@@ -1172,7 +1172,7 @@ table_changed:
* The prefix always takes precedence and forces a switch to the prefix
* table, unless we are already there.
*/
- key0 = (key & ~KEYC_XTERM);
+ key0 = (key & (KEYC_MASK_KEY|KEYC_MASK_MODIFIERS));
if ((key0 == (key_code)options_get_number(s->options, "prefix") ||
key0 == (key_code)options_get_number(s->options, "prefix2")) &&
strcmp(table->name, "prefix") != 0) {
diff --git a/status.c b/status.c
index 9bee2e7b..93ac70df 100644
--- a/status.c
+++ b/status.c
@@ -1023,7 +1023,7 @@ status_prompt_key(struct client *c, key_code key)
int keys;
if (c->prompt_flags & PROMPT_KEY) {
- keystring = key_string_lookup_key(key);
+ keystring = key_string_lookup_key(key, 0);
c->prompt_inputcb(c, c->prompt_data, keystring, 1);
status_prompt_clear(c);
return (0);
@@ -1039,7 +1039,7 @@ status_prompt_key(struct client *c, key_code key)
free(s);
return (1);
}
- key &= ~KEYC_XTERM;
+ key &= ~KEYC_MASK_FLAGS;
keys = options_get_number(c->session->options, "status-keys");
if (keys == MODEKEY_VI) {
diff --git a/tmux.h b/tmux.h
index 9c27944b..07d10bcc 100644
--- a/tmux.h
+++ b/tmux.h
@@ -114,27 +114,31 @@ struct winlink;
#define VISUAL_BOTH 2
/* Special key codes. */
-#define KEYC_NONE 0x00ff000000000ULL
-#define KEYC_UNKNOWN 0x00fe000000000ULL
-#define KEYC_BASE 0x0001000000000ULL
-#define KEYC_USER 0x0002000000000ULL
+#define KEYC_NONE 0x00ff000000000ULL
+#define KEYC_UNKNOWN 0x00fe000000000ULL
+#define KEYC_BASE 0x0001000000000ULL
+#define KEYC_USER 0x0002000000000ULL
/* Key modifier bits. */
-#define KEYC_META 0x0100000000000ULL
-#define KEYC_CTRL 0x0200000000000ULL
-#define KEYC_SHIFT 0x0400000000000ULL
-#define KEYC_XTERM 0x0800000000000ULL
-#define KEYC_LITERAL 0x1000000000000ULL
-#define KEYC_KEYPAD 0x2000000000000ULL
-#define KEYC_CURSOR 0x4000000000000ULL
+#define KEYC_META 0x00100000000000ULL
+#define KEYC_CTRL 0x00200000000000ULL
+#define KEYC_SHIFT 0x00400000000000ULL
+
+/* Key flag bits. */
+#define KEYC_LITERAL 0x01000000000000ULL
+#define KEYC_KEYPAD 0x02000000000000ULL
+#define KEYC_CURSOR 0x04000000000000ULL
+#define KEYC_IMPLIED_META 0x08000000000000ULL
+#define KEYC_BUILD_MODIFIERS 0x10000000000000ULL
+
+/* Masks for key bits. */
+#define KEYC_MASK_MODIFIERS 0x00f00000000000ULL
+#define KEYC_MASK_FLAGS 0xff000000000000ULL
+#define KEYC_MASK_KEY 0x000fffffffffffULL
/* Available user keys. */
#define KEYC_NUSER 1000
-/* Mask to obtain key w/o modifiers. */
-#define KEYC_MASK_MOD 0xff00000000000ULL
-#define KEYC_MASK_KEY 0x00fffffffffffULL
-
/* Is this a mouse key? */
#define KEYC_IS_MOUSE(key) (((key) & KEYC_MASK_KEY) >= KEYC_MOUSE && \
((key) & KEYC_MASK_KEY) < KEYC_BSPACE)
@@ -2286,7 +2290,7 @@ struct cmdq_item *key_bindings_dispatch(struct key_binding *,
/* key-string.c */
key_code key_string_lookup_string(const char *);
-const char *key_string_lookup_key(key_code);
+const char *key_string_lookup_key(key_code, int);
/* alerts.c */
void alerts_reset_all(void);
diff --git a/tty-keys.c b/tty-keys.c
index 1c424c5d..99200689 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -225,13 +225,13 @@ static const struct tty_default_key_xterm tty_default_xterm_keys[] = {
static const key_code tty_default_xterm_modifiers[] = {
0,
0,
- KEYC_SHIFT|KEYC_XTERM,
- KEYC_META|KEYC_XTERM,
- KEYC_SHIFT|KEYC_META|KEYC_XTERM,
- KEYC_CTRL|KEYC_XTERM,
- KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM,
- KEYC_META|KEYC_CTRL|KEYC_XTERM,
- KEYC_SHIFT|KEYC_META|KEYC_CTRL|KEYC_XTERM
+ KEYC_SHIFT,
+ KEYC_META|KEYC_IMPLIED_META,
+ KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META,
+ KEYC_CTRL,
+ KEYC_SHIFT|KEYC_CTRL,
+ KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL,
+ KEYC_SHIFT|KEYC_META|KEYC_CTRL
};
/*
@@ -258,61 +258,61 @@ static const struct tty_default_key_code tty_default_code_keys[] = {
{ TTYC_KF11, KEYC_F11 },
{ TTYC_KF12, KEYC_F12 },
- { TTYC_KF13, KEYC_F1|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF14, KEYC_F2|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF15, KEYC_F3|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF16, KEYC_F4|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF17, KEYC_F5|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF18, KEYC_F6|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF19, KEYC_F7|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF20, KEYC_F8|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF21, KEYC_F9|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF22, KEYC_F10|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF23, KEYC_F11|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF24, KEYC_F12|KEYC_SHIFT|KEYC_XTERM },
-
- { TTYC_KF25, KEYC_F1|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF26, KEYC_F2|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF27, KEYC_F3|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF28, KEYC_F4|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF29, KEYC_F5|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF30, KEYC_F6|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF31, KEYC_F7|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF32, KEYC_F8|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF33, KEYC_F9|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF34, KEYC_F10|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF35, KEYC_F11|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF36, KEYC_F12|KEYC_CTRL|KEYC_XTERM },
-
- { TTYC_KF37, KEYC_F1|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF38, KEYC_F2|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF39, KEYC_F3|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF40, KEYC_F4|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF41, KEYC_F5|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF42, KEYC_F6|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF43, KEYC_F7|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF44, KEYC_F8|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF45, KEYC_F9|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF46, KEYC_F10|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF47, KEYC_F11|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KF48, KEYC_F12|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
-
- { TTYC_KF49, KEYC_F1|KEYC_META|KEYC_XTERM },
- { TTYC_KF50, KEYC_F2|KEYC_META|KEYC_XTERM },
- { TTYC_KF51, KEYC_F3|KEYC_META|KEYC_XTERM },
- { TTYC_KF52, KEYC_F4|KEYC_META|KEYC_XTERM },
- { TTYC_KF53, KEYC_F5|KEYC_META|KEYC_XTERM },
- { TTYC_KF54, KEYC_F6|KEYC_META|KEYC_XTERM },
- { TTYC_KF55, KEYC_F7|KEYC_META|KEYC_XTERM },
- { TTYC_KF56, KEYC_F8|KEYC_META|KEYC_XTERM },
- { TTYC_KF57, KEYC_F9|KEYC_META|KEYC_XTERM },
- { TTYC_KF58, KEYC_F10|KEYC_META|KEYC_XTERM },
- { TTYC_KF59, KEYC_F11|KEYC_META|KEYC_XTERM },
- { TTYC_KF60, KEYC_F12|KEYC_META|KEYC_XTERM },
-
- { TTYC_KF61, KEYC_F1|KEYC_META|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF62, KEYC_F2|KEYC_META|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KF63, KEYC_F3|KEYC_META|KEYC_SHIFT|KEYC_XTERM },
+ { TTYC_KF13, KEYC_F1|KEYC_SHIFT },
+ { TTYC_KF14, KEYC_F2|KEYC_SHIFT },
+ { TTYC_KF15, KEYC_F3|KEYC_SHIFT },
+ { TTYC_KF16, KEYC_F4|KEYC_SHIFT },
+ { TTYC_KF17, KEYC_F5|KEYC_SHIFT },
+ { TTYC_KF18, KEYC_F6|KEYC_SHIFT },
+ { TTYC_KF19, KEYC_F7|KEYC_SHIFT },
+ { TTYC_KF20, KEYC_F8|KEYC_SHIFT },
+ { TTYC_KF21, KEYC_F9|KEYC_SHIFT },
+ { TTYC_KF22, KEYC_F10|KEYC_SHIFT },
+ { TTYC_KF23, KEYC_F11|KEYC_SHIFT },
+ { TTYC_KF24, KEYC_F12|KEYC_SHIFT },
+
+ { TTYC_KF25, KEYC_F1|KEYC_CTRL },
+ { TTYC_KF26, KEYC_F2|KEYC_CTRL },
+ { TTYC_KF27, KEYC_F3|KEYC_CTRL },
+ { TTYC_KF28, KEYC_F4|KEYC_CTRL },
+ { TTYC_KF29, KEYC_F5|KEYC_CTRL },
+ { TTYC_KF30, KEYC_F6|KEYC_CTRL },
+ { TTYC_KF31, KEYC_F7|KEYC_CTRL },
+ { TTYC_KF32, KEYC_F8|KEYC_CTRL },
+ { TTYC_KF33, KEYC_F9|KEYC_CTRL },
+ { TTYC_KF34, KEYC_F10|KEYC_CTRL },
+ { TTYC_KF35, KEYC_F11|KEYC_CTRL },
+ { TTYC_KF36, KEYC_F12|KEYC_CTRL },
+
+ { TTYC_KF37, KEYC_F1|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF38, KEYC_F2|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF39, KEYC_F3|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF40, KEYC_F4|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF41, KEYC_F5|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF42, KEYC_F6|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF43, KEYC_F7|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF44, KEYC_F8|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF45, KEYC_F9|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF46, KEYC_F10|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF47, KEYC_F11|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KF48, KEYC_F12|KEYC_SHIFT|KEYC_CTRL },
+
+ { TTYC_KF49, KEYC_F1|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF50, KEYC_F2|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF51, KEYC_F3|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF52, KEYC_F4|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF53, KEYC_F5|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF54, KEYC_F6|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF55, KEYC_F7|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF56, KEYC_F8|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF57, KEYC_F9|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF58, KEYC_F10|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF59, KEYC_F11|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KF60, KEYC_F12|KEYC_META|KEYC_IMPLIED_META },
+
+ { TTYC_KF61, KEYC_F1|KEYC_META|KEYC_IMPLIED_META|KEYC_SHIFT },
+ { TTYC_KF62, KEYC_F2|KEYC_META|KEYC_IMPLIED_META|KEYC_SHIFT },
+ { TTYC_KF63, KEYC_F3|KEYC_META|KEYC_IMPLIED_META|KEYC_SHIFT },
{ TTYC_KICH1, KEYC_IC },
{ TTYC_KDCH1, KEYC_DC },
@@ -329,68 +329,68 @@ static const struct tty_default_key_code tty_default_code_keys[] = {
{ TTYC_KCUF1, KEYC_RIGHT|KEYC_CURSOR },
/* Key and modifier capabilities. */
- { TTYC_KDC2, KEYC_DC|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KDC3, KEYC_DC|KEYC_META|KEYC_XTERM },
- { TTYC_KDC4, KEYC_DC|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KDC5, KEYC_DC|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KDC6, KEYC_DC|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KDC7, KEYC_DC|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KIND, KEYC_DOWN|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KDN2, KEYC_DOWN|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KDN3, KEYC_DOWN|KEYC_META|KEYC_XTERM },
- { TTYC_KDN4, KEYC_DOWN|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KDN5, KEYC_DOWN|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KDN6, KEYC_DOWN|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KDN7, KEYC_DOWN|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KEND2, KEYC_END|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KEND3, KEYC_END|KEYC_META|KEYC_XTERM },
- { TTYC_KEND4, KEYC_END|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KEND5, KEYC_END|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KEND6, KEYC_END|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KEND7, KEYC_END|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KHOM2, KEYC_HOME|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KHOM3, KEYC_HOME|KEYC_META|KEYC_XTERM },
- { TTYC_KHOM4, KEYC_HOME|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KHOM5, KEYC_HOME|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KHOM6, KEYC_HOME|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KHOM7, KEYC_HOME|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KIC2, KEYC_IC|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KIC3, KEYC_IC|KEYC_META|KEYC_XTERM },
- { TTYC_KIC4, KEYC_IC|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KIC5, KEYC_IC|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KIC6, KEYC_IC|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KIC7, KEYC_IC|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KLFT2, KEYC_LEFT|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KLFT3, KEYC_LEFT|KEYC_META|KEYC_XTERM },
- { TTYC_KLFT4, KEYC_LEFT|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KLFT5, KEYC_LEFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KLFT6, KEYC_LEFT|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KLFT7, KEYC_LEFT|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KNXT2, KEYC_NPAGE|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KNXT3, KEYC_NPAGE|KEYC_META|KEYC_XTERM },
- { TTYC_KNXT4, KEYC_NPAGE|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KNXT5, KEYC_NPAGE|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KNXT6, KEYC_NPAGE|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KNXT7, KEYC_NPAGE|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KPRV2, KEYC_PPAGE|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KPRV3, KEYC_PPAGE|KEYC_META|KEYC_XTERM },
- { TTYC_KPRV4, KEYC_PPAGE|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KPRV5, KEYC_PPAGE|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KPRV6, KEYC_PPAGE|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KPRV7, KEYC_PPAGE|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KRIT2, KEYC_RIGHT|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KRIT3, KEYC_RIGHT|KEYC_META|KEYC_XTERM },
- { TTYC_KRIT4, KEYC_RIGHT|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KRIT5, KEYC_RIGHT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KRIT6, KEYC_RIGHT|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KRIT7, KEYC_RIGHT|KEYC_META|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KRI, KEYC_UP|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KUP2, KEYC_UP|KEYC_SHIFT|KEYC_XTERM },
- { TTYC_KUP3, KEYC_UP|KEYC_META|KEYC_XTERM },
- { TTYC_KUP4, KEYC_UP|KEYC_SHIFT|KEYC_META|KEYC_XTERM },
- { TTYC_KUP5, KEYC_UP|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KUP6, KEYC_UP|KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM },
- { TTYC_KUP7, KEYC_UP|KEYC_META|KEYC_CTRL|KEYC_XTERM },
+ { TTYC_KDC2, KEYC_DC|KEYC_SHIFT },
+ { TTYC_KDC3, KEYC_DC|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KDC4, KEYC_DC|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KDC5, KEYC_DC|KEYC_CTRL },
+ { TTYC_KDC6, KEYC_DC|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KDC7, KEYC_DC|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KIND, KEYC_DOWN|KEYC_SHIFT },
+ { TTYC_KDN2, KEYC_DOWN|KEYC_SHIFT },
+ { TTYC_KDN3, KEYC_DOWN|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KDN4, KEYC_DOWN|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KDN5, KEYC_DOWN|KEYC_CTRL },
+ { TTYC_KDN6, KEYC_DOWN|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KDN7, KEYC_DOWN|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KEND2, KEYC_END|KEYC_SHIFT },
+ { TTYC_KEND3, KEYC_END|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KEND4, KEYC_END|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KEND5, KEYC_END|KEYC_CTRL },
+ { TTYC_KEND6, KEYC_END|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KEND7, KEYC_END|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KHOM2, KEYC_HOME|KEYC_SHIFT },
+ { TTYC_KHOM3, KEYC_HOME|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KHOM4, KEYC_HOME|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KHOM5, KEYC_HOME|KEYC_CTRL },
+ { TTYC_KHOM6, KEYC_HOME|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KHOM7, KEYC_HOME|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KIC2, KEYC_IC|KEYC_SHIFT },
+ { TTYC_KIC3, KEYC_IC|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KIC4, KEYC_IC|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KIC5, KEYC_IC|KEYC_CTRL },
+ { TTYC_KIC6, KEYC_IC|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KIC7, KEYC_IC|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KLFT2, KEYC_LEFT|KEYC_SHIFT },
+ { TTYC_KLFT3, KEYC_LEFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KLFT4, KEYC_LEFT|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KLFT5, KEYC_LEFT|KEYC_CTRL },
+ { TTYC_KLFT6, KEYC_LEFT|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KLFT7, KEYC_LEFT|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KNXT2, KEYC_NPAGE|KEYC_SHIFT },
+ { TTYC_KNXT3, KEYC_NPAGE|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KNXT4, KEYC_NPAGE|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KNXT5, KEYC_NPAGE|KEYC_CTRL },
+ { TTYC_KNXT6, KEYC_NPAGE|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KNXT7, KEYC_NPAGE|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KPRV2, KEYC_PPAGE|KEYC_SHIFT },
+ { TTYC_KPRV3, KEYC_PPAGE|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KPRV4, KEYC_PPAGE|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KPRV5, KEYC_PPAGE|KEYC_CTRL },
+ { TTYC_KPRV6, KEYC_PPAGE|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KPRV7, KEYC_PPAGE|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KRIT2, KEYC_RIGHT|KEYC_SHIFT },
+ { TTYC_KRIT3, KEYC_RIGHT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KRIT4, KEYC_RIGHT|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KRIT5, KEYC_RIGHT|KEYC_CTRL },
+ { TTYC_KRIT6, KEYC_RIGHT|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KRIT7, KEYC_RIGHT|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
+ { TTYC_KRI, KEYC_UP|KEYC_SHIFT },
+ { TTYC_KUP2, KEYC_UP|KEYC_SHIFT },
+ { TTYC_KUP3, KEYC_UP|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KUP4, KEYC_UP|KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META },
+ { TTYC_KUP5, KEYC_UP|KEYC_CTRL },
+ { TTYC_KUP6, KEYC_UP|KEYC_SHIFT|KEYC_CTRL },
+ { TTYC_KUP7, KEYC_UP|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
};
/* Add key to tree. */
@@ -401,7 +401,7 @@ tty_keys_add(struct tty *tty, const char *s, key_code key)
size_t size;
const char *keystr;
- keystr = key_string_lookup_key(key);
+ keystr = key_string_lookup_key(key, 1);
if ((tk = tty_keys_find(tty, s, strlen(s), &size)) == NULL) {
log_debug("new key %s: 0x%llx (%s)", s, key, keystr);
tty_keys_add1(&tty->key_tree, s, key);
@@ -719,7 +719,7 @@ first_key:
/* Look for a key without the escape. */
n = tty_keys_next1(tty, buf + 1, len - 1, &key, &size, expired);
if (n == 0) { /* found */
- if (key & KEYC_XTERM) {
+ if (key & KEYC_IMPLIED_META) {
/*
* We want the escape key as well as the xterm
* key, because the xterm sequence implicitly
@@ -789,7 +789,7 @@ complete_key:
*/
bspace = tty->tio.c_cc[VERASE];
if (bspace != _POSIX_VDISABLE && (key & KEYC_MASK_KEY) == bspace)
- key = (key & KEYC_MASK_MOD) | KEYC_BSPACE;
+ key = (key & KEYC_MASK_MODIFIERS)|KEYC_BSPACE;
/* Remove data from buffer. */
evbuffer_drain(tty->in, size);
@@ -896,16 +896,16 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len,
*size = end + 1;
/* Store the key and modifiers. */
- *key = number|KEYC_XTERM;
+ *key = number;
switch (modifiers) {
case 2:
(*key) |= KEYC_SHIFT;
break;
case 3:
- (*key) |= KEYC_META;
+ (*key) |= (KEYC_META|KEYC_IMPLIED_META);
break;
case 4:
- (*key) |= (KEYC_SHIFT|KEYC_META);
+ (*key) |= (KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META);
break;
case 5:
(*key) |= KEYC_CTRL;
@@ -917,7 +917,7 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len,
(*key) |= (KEYC_META|KEYC_CTRL);
break;
case 8:
- (*key) |= (KEYC_SHIFT|KEYC_META|KEYC_CTRL);
+ (*key) |= (KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL);
break;
default:
*key = KEYC_NONE;
@@ -925,7 +925,7 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len,
}
if (log_get_level() != 0) {
log_debug("%s: extended key %.*s is %llx (%s)", c->name,
- (int)*size, buf, *key, key_string_lookup_key(*key));
+ (int)*size, buf, *key, key_string_lookup_key(*key, 1));
}
return (0);
}
diff --git a/window-customize.c b/window-customize.c
index 12c09cf6..5130357f 100644
--- a/window-customize.c
+++ b/window-customize.c
@@ -460,7 +460,7 @@ window_customize_build_keys(struct window_customize_modedata *data,
bd = key_bindings_first(kt);
while (bd != NULL) {
- format_add(ft, "key", "%s", key_string_lookup_key(bd->key));
+ format_add(ft, "key", "%s", key_string_lookup_key(bd->key, 0));
if (bd->note != NULL)
format_add(ft, "key_note", "%s", bd->note);
if (filter != NULL) {
@@ -1233,7 +1233,7 @@ window_customize_set_key(struct client *c,
if (strcmp(s, "Repeat") == 0)
bd->flags ^= KEY_BINDING_REPEAT;
else if (strcmp(s, "Command") == 0) {
- xasprintf(&prompt, "(%s) ", key_string_lookup_key(key));
+ xasprintf(&prompt, "(%s) ", key_string_lookup_key(key, 0));
value = cmd_list_print(bd->cmdlist, 0);
new_item = xcalloc(1, sizeof *new_item);
@@ -1250,7 +1250,7 @@ window_customize_set_key(struct client *c,
free(prompt);
free(value);
} else if (strcmp(s, "Note") == 0) {
- xasprintf(&prompt, "(%s) ", key_string_lookup_key(key));
+ xasprintf(&prompt, "(%s) ", key_string_lookup_key(key, 0));
new_item = xcalloc(1, sizeof *new_item);
new_item->data = data;
@@ -1395,7 +1395,7 @@ window_customize_key(struct window_mode_entry *wme, struct client *c,
break;
if (item->scope == WINDOW_CUSTOMIZE_KEY) {
xasprintf(&prompt, "Unbind key %s? ",
- key_string_lookup_key(item->key));
+ key_string_lookup_key(item->key, 0));
} else
xasprintf(&prompt, "Unset option %s? ", item->name);
data->references++;
diff --git a/window.c b/window.c
index 8121ba2d..7cb098dd 100644
--- a/window.c
+++ b/window.c
@@ -1145,8 +1145,10 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
wme = TAILQ_FIRST(&wp->modes);
if (wme != NULL) {
- if (wme->mode->key != NULL && c != NULL)
- wme->mode->key(wme, c, s, wl, (key & ~KEYC_XTERM), m);
+ if (wme->mode->key != NULL && c != NULL) {
+ key &= ~KEYC_MASK_FLAGS;
+ wme->mode->key(wme, c, s, wl, key, m);
+ }
return (0);
}