=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/server-client.c,v retrieving revision 1.177 retrieving revision 1.178 diff -c -r1.177 -r1.178 *** src/usr.bin/tmux/server-client.c 2015/12/12 18:19:00 1.177 --- src/usr.bin/tmux/server-client.c 2015/12/12 18:32:24 1.178 *************** *** 1,4 **** ! /* $OpenBSD: server-client.c,v 1.177 2015/12/12 18:19:00 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: server-client.c,v 1.178 2015/12/12 18:32:24 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 32,38 **** #include "tmux.h" - void server_client_key_table(struct client *, const char *); void server_client_free(int, short, void *); void server_client_check_focus(struct window_pane *); void server_client_check_resize(struct window_pane *); --- 32,37 ---- *************** *** 72,84 **** /* Set client key table. */ void ! server_client_key_table(struct client *c, const char *name) { key_bindings_unref_table(c->keytable); c->keytable = key_bindings_get_table(name, 1); c->keytable->references++; } /* Create a new client. */ void server_client_create(int fd) --- 71,102 ---- /* Set client key table. */ void ! server_client_set_key_table(struct client *c, const char *name) { + if (name == NULL) + name = server_client_get_key_table(c); + key_bindings_unref_table(c->keytable); c->keytable = key_bindings_get_table(name, 1); c->keytable->references++; } + /* Get default key table. */ + const char * + server_client_get_key_table(struct client *c) + { + struct session *s = c->session; + const char *name; + + if (s == NULL) + return ("root"); + + name = options_get_string(s->options, "key-table"); + if (*name == '\0') + return ("root"); + return (name); + } + /* Create a new client. */ void server_client_create(int fd) *************** *** 598,604 **** * again in the root table. */ if ((c->flags & CLIENT_REPEAT) && !bd->can_repeat) { ! server_client_key_table(c, "root"); c->flags &= ~CLIENT_REPEAT; server_status_client(c); goto retry; --- 616,622 ---- * again in the root table. */ if ((c->flags & CLIENT_REPEAT) && !bd->can_repeat) { ! server_client_set_key_table(c, NULL); c->flags &= ~CLIENT_REPEAT; server_status_client(c); goto retry; *************** *** 625,631 **** evtimer_add(&c->repeat_timer, &tv); } else { c->flags &= ~CLIENT_REPEAT; ! server_client_key_table(c, "root"); } server_status_client(c); --- 643,649 ---- evtimer_add(&c->repeat_timer, &tv); } else { c->flags &= ~CLIENT_REPEAT; ! server_client_set_key_table(c, NULL); } server_status_client(c); *************** *** 640,654 **** * root table and try again. */ if (c->flags & CLIENT_REPEAT) { ! server_client_key_table(c, "root"); c->flags &= ~CLIENT_REPEAT; server_status_client(c); goto retry; } /* If no match and we're not in the root table, that's it. */ ! if (strcmp(c->keytable->name, "root") != 0) { ! server_client_key_table(c, "root"); server_status_client(c); return; } --- 658,672 ---- * root table and try again. */ if (c->flags & CLIENT_REPEAT) { ! server_client_set_key_table(c, NULL); c->flags &= ~CLIENT_REPEAT; server_status_client(c); goto retry; } /* If no match and we're not in the root table, that's it. */ ! if (strcmp(c->keytable->name, server_client_get_key_table(c)) != 0) { ! server_client_set_key_table(c, NULL); server_status_client(c); return; } *************** *** 659,665 **** */ if (key == (key_code)options_get_number(s->options, "prefix") || key == (key_code)options_get_number(s->options, "prefix2")) { ! server_client_key_table(c, "prefix"); server_status_client(c); return; } --- 677,683 ---- */ if (key == (key_code)options_get_number(s->options, "prefix") || key == (key_code)options_get_number(s->options, "prefix2")) { ! server_client_set_key_table(c, "prefix"); server_status_client(c); return; } *************** *** 834,840 **** struct client *c = data; if (c->flags & CLIENT_REPEAT) { ! server_client_key_table(c, "root"); c->flags &= ~CLIENT_REPEAT; server_status_client(c); } --- 852,858 ---- struct client *c = data; if (c->flags & CLIENT_REPEAT) { ! server_client_set_key_table(c, NULL); c->flags &= ~CLIENT_REPEAT; server_status_client(c); }