Permit multiple prefix keys to be defined, separated by commas, for example:

set -g prefix ^a,^b

Any key in the list acts as the prefix. The send-prefix command always sends
the first key in the list.
This commit is contained in:
Nicholas Marriott
2009-09-22 12:38:10 +00:00
parent 6fab9a3e6f
commit 96dd3e8eb9
9 changed files with 118 additions and 29 deletions

View File

@ -798,8 +798,9 @@ server_handle_client(struct client *c)
struct screen *s;
struct timeval tv;
struct key_binding *bd;
int key, prefix, status, xtimeout;
int mode;
struct keylist *keylist;
int key, status, xtimeout, mode, isprefix;
u_int i;
u_char mouse[3];
xtimeout = options_get_number(&c->session->options, "repeat-time");
@ -811,7 +812,7 @@ server_handle_client(struct client *c)
}
/* Process keys. */
prefix = options_get_number(&c->session->options, "prefix");
keylist = options_get_data(&c->session->options, "prefix");
while (tty_keys_next(&c->tty, &key, mouse) == 0) {
server_activity = time(NULL);
@ -844,9 +845,18 @@ server_handle_client(struct client *c)
continue;
}
/* Is this a prefix key? */
isprefix = 0;
for (i = 0; i < ARRAY_LENGTH(keylist); i++) {
if (key == ARRAY_ITEM(keylist, i)) {
isprefix = 1;
break;
}
}
/* No previous prefix key. */
if (!(c->flags & CLIENT_PREFIX)) {
if (key == prefix)
if (isprefix)
c->flags |= CLIENT_PREFIX;
else {
/* Try as a non-prefix key binding. */
@ -864,7 +874,7 @@ server_handle_client(struct client *c)
/* If repeating, treat this as a key, else ignore. */
if (c->flags & CLIENT_REPEAT) {
c->flags &= ~CLIENT_REPEAT;
if (key == prefix)
if (isprefix)
c->flags |= CLIENT_PREFIX;
else
window_pane_key(wp, c, key);
@ -875,7 +885,7 @@ server_handle_client(struct client *c)
/* If already repeating, but this key can't repeat, skip it. */
if (c->flags & CLIENT_REPEAT && !bd->can_repeat) {
c->flags &= ~CLIENT_REPEAT;
if (key == prefix)
if (isprefix)
c->flags |= CLIENT_PREFIX;
else
window_pane_key(wp, c, key);