version 1.222, 2017/04/21 14:01:19 |
version 1.223, 2017/04/21 16:04:18 |
|
|
return (name); |
return (name); |
} |
} |
|
|
/* Is this client using the default key table? */ |
/* Is this table the default key table? */ |
int |
static int |
server_client_is_default_key_table(struct client *c) |
server_client_is_default_key_table(struct client *c, struct key_table *table) |
{ |
{ |
return (strcmp(c->keytable->name, server_client_get_key_table(c)) == 0); |
return (strcmp(table->name, server_client_get_key_table(c)) == 0); |
} |
} |
|
|
/* Create a new client. */ |
/* Create a new client. */ |
|
|
struct window *w; |
struct window *w; |
struct window_pane *wp; |
struct window_pane *wp; |
struct timeval tv; |
struct timeval tv; |
const char *name; |
struct key_table *table, *first; |
struct key_table *table; |
|
struct key_binding bd_find, *bd; |
struct key_binding bd_find, *bd; |
int xtimeout; |
int xtimeout; |
struct cmd_find_state fs; |
struct cmd_find_state fs; |
|
|
if (!KEYC_IS_MOUSE(key) && server_client_assume_paste(s)) |
if (!KEYC_IS_MOUSE(key) && server_client_assume_paste(s)) |
goto forward; |
goto forward; |
|
|
retry: |
|
/* |
/* |
* Work out the current key table. If the pane is in a mode, use |
* Work out the current key table. If the pane is in a mode, use |
* the mode table instead of the default key table. |
* the mode table instead of the default key table. |
*/ |
*/ |
name = NULL; |
if (server_client_is_default_key_table(c, c->keytable) && |
if (wp != NULL && wp->mode != NULL && wp->mode->key_table != NULL) |
wp != NULL && |
name = wp->mode->key_table(wp); |
wp->mode != NULL && |
if (name == NULL || !server_client_is_default_key_table(c)) |
wp->mode->key_table != NULL) |
table = c->keytable; |
table = key_bindings_get_table(wp->mode->key_table(wp), 1); |
else |
else |
table = key_bindings_get_table(name, 1); |
table = c->keytable; |
if (wp == NULL) |
first = table; |
log_debug("key table %s (no pane)", table->name); |
|
else |
|
log_debug("key table %s (pane %%%u)", table->name, wp->id); |
|
|
|
/* |
/* |
* The prefix always takes precedence and forces a switch to the prefix |
* The prefix always takes precedence and forces a switch to the prefix |
|
|
return; |
return; |
} |
} |
|
|
|
retry: |
|
/* Log key table. */ |
|
if (wp == NULL) |
|
log_debug("key table %s (no pane)", table->name); |
|
else |
|
log_debug("key table %s (pane %%%u)", table->name, wp->id); |
|
|
/* Try to see if there is a key binding in the current table. */ |
/* Try to see if there is a key binding in the current table. */ |
bd_find.key = key; |
bd_find.key = key; |
bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find); |
bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find); |
|
|
server_client_set_key_table(c, NULL); |
server_client_set_key_table(c, NULL); |
c->flags &= ~CLIENT_REPEAT; |
c->flags &= ~CLIENT_REPEAT; |
server_status_client(c); |
server_status_client(c); |
|
table = c->keytable; |
goto retry; |
goto retry; |
} |
} |
|
log_debug("found in key table %s", table->name); |
|
|
/* |
/* |
* Take a reference to this table to make sure the key binding |
* Take a reference to this table to make sure the key binding |
|
|
} |
} |
|
|
/* |
/* |
* No match in this table. If repeating, switch the client back to the |
* No match in this table. If not in the root table or if repeating, |
* root table and try again. |
* switch the client back to the root table and try again. |
*/ |
*/ |
if (c->flags & CLIENT_REPEAT) { |
log_debug("not found in key table %s", table->name); |
|
if (!server_client_is_default_key_table(c, table) || |
|
(c->flags & CLIENT_REPEAT)) { |
server_client_set_key_table(c, NULL); |
server_client_set_key_table(c, NULL); |
c->flags &= ~CLIENT_REPEAT; |
c->flags &= ~CLIENT_REPEAT; |
server_status_client(c); |
server_status_client(c); |
|
table = c->keytable; |
goto retry; |
goto retry; |
} |
} |
|
|
/* If no match and we're not in the root table, that's it. */ |
/* |
if (name == NULL && !server_client_is_default_key_table(c)) { |
* No match in the root table either. If this wasn't the first table |
log_debug("no key in key table %s", table->name); |
* tried, don't pass the key to the pane. |
|
*/ |
|
if (first != table) { |
server_client_set_key_table(c, NULL); |
server_client_set_key_table(c, NULL); |
server_status_client(c); |
server_status_client(c); |
return; |
return; |