version 1.177, 2015/12/12 18:19:00 |
version 1.178, 2015/12/12 18:32:24 |
|
|
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
void server_client_key_table(struct client *, const char *); |
|
void server_client_free(int, short, void *); |
void server_client_free(int, short, void *); |
void server_client_check_focus(struct window_pane *); |
void server_client_check_focus(struct window_pane *); |
void server_client_check_resize(struct window_pane *); |
void server_client_check_resize(struct window_pane *); |
|
|
|
|
/* Set client key table. */ |
/* Set client key table. */ |
void |
void |
server_client_key_table(struct client *c, const char *name) |
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); |
key_bindings_unref_table(c->keytable); |
c->keytable = key_bindings_get_table(name, 1); |
c->keytable = key_bindings_get_table(name, 1); |
c->keytable->references++; |
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. */ |
/* Create a new client. */ |
void |
void |
server_client_create(int fd) |
server_client_create(int fd) |
|
|
* again in the root table. |
* again in the root table. |
*/ |
*/ |
if ((c->flags & CLIENT_REPEAT) && !bd->can_repeat) { |
if ((c->flags & CLIENT_REPEAT) && !bd->can_repeat) { |
server_client_key_table(c, "root"); |
server_client_set_key_table(c, NULL); |
c->flags &= ~CLIENT_REPEAT; |
c->flags &= ~CLIENT_REPEAT; |
server_status_client(c); |
server_status_client(c); |
goto retry; |
goto retry; |
|
|
evtimer_add(&c->repeat_timer, &tv); |
evtimer_add(&c->repeat_timer, &tv); |
} else { |
} else { |
c->flags &= ~CLIENT_REPEAT; |
c->flags &= ~CLIENT_REPEAT; |
server_client_key_table(c, "root"); |
server_client_set_key_table(c, NULL); |
} |
} |
server_status_client(c); |
server_status_client(c); |
|
|
|
|
* root table and try again. |
* root table and try again. |
*/ |
*/ |
if (c->flags & CLIENT_REPEAT) { |
if (c->flags & CLIENT_REPEAT) { |
server_client_key_table(c, "root"); |
server_client_set_key_table(c, NULL); |
c->flags &= ~CLIENT_REPEAT; |
c->flags &= ~CLIENT_REPEAT; |
server_status_client(c); |
server_status_client(c); |
goto retry; |
goto retry; |
} |
} |
|
|
/* If no match and we're not in the root table, that's it. */ |
/* If no match and we're not in the root table, that's it. */ |
if (strcmp(c->keytable->name, "root") != 0) { |
if (strcmp(c->keytable->name, server_client_get_key_table(c)) != 0) { |
server_client_key_table(c, "root"); |
server_client_set_key_table(c, NULL); |
server_status_client(c); |
server_status_client(c); |
return; |
return; |
} |
} |
|
|
*/ |
*/ |
if (key == (key_code)options_get_number(s->options, "prefix") || |
if (key == (key_code)options_get_number(s->options, "prefix") || |
key == (key_code)options_get_number(s->options, "prefix2")) { |
key == (key_code)options_get_number(s->options, "prefix2")) { |
server_client_key_table(c, "prefix"); |
server_client_set_key_table(c, "prefix"); |
server_status_client(c); |
server_status_client(c); |
return; |
return; |
} |
} |
|
|
struct client *c = data; |
struct client *c = data; |
|
|
if (c->flags & CLIENT_REPEAT) { |
if (c->flags & CLIENT_REPEAT) { |
server_client_key_table(c, "root"); |
server_client_set_key_table(c, NULL); |
c->flags &= ~CLIENT_REPEAT; |
c->flags &= ~CLIENT_REPEAT; |
server_status_client(c); |
server_status_client(c); |
} |
} |