=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/server-client.c,v retrieving revision 1.204 retrieving revision 1.205 diff -c -r1.204 -r1.205 *** src/usr.bin/tmux/server-client.c 2016/11/24 18:45:45 1.204 --- src/usr.bin/tmux/server-client.c 2016/12/07 09:16:13 1.205 *************** *** 1,4 **** ! /* $OpenBSD: server-client.c,v 1.204 2016/11/24 18:45:45 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: server-client.c,v 1.205 2016/12/07 09:16:13 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 782,787 **** --- 782,799 ---- else log_debug("key table %s (pane %%%u)", table->name, wp->id); + /* + * The prefix always takes precedence and forces a switch to the prefix + * table, unless we are already there. + */ + if ((key == (key_code)options_get_number(s->options, "prefix") || + key == (key_code)options_get_number(s->options, "prefix2")) && + strcmp(table->name, "prefix") != 0) { + server_client_set_key_table(c, "prefix"); + server_status_client(c); + return; + } + /* Try to see if there is a key binding in the current table. */ bd_find.key = key; bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find); *************** *** 854,871 **** /* If no match and we're not in the root table, that's it. */ if (name == NULL && !server_client_is_default_key_table(c)) { server_client_set_key_table(c, NULL); - server_status_client(c); - return; - } - - /* - * No match, but in the root table. Prefix switches to the prefix table - * and everything else is passed through. - */ - 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; } --- 866,873 ---- /* If no match and we're not in the root table, that's it. */ if (name == NULL && !server_client_is_default_key_table(c)) { + log_debug("no key in key table %s", table->name); server_client_set_key_table(c, NULL); server_status_client(c); return; }