version 1.37, 2013/03/22 15:54:29 |
version 1.38, 2013/03/24 09:54:10 |
|
|
RB_INIT(&key_bindings); |
RB_INIT(&key_bindings); |
|
|
for (i = 0; i < nitems(table); i++) { |
for (i = 0; i < nitems(table); i++) { |
cmdlist = xmalloc(sizeof *cmdlist); |
cmdlist = xcalloc(1, sizeof *cmdlist); |
TAILQ_INIT(&cmdlist->list); |
|
cmdlist->references = 1; |
cmdlist->references = 1; |
|
TAILQ_INIT(&cmdlist->list); |
|
|
cmd = xmalloc(sizeof *cmd); |
cmd = xcalloc(1, sizeof *cmd); |
cmd->entry = table[i].entry; |
cmd->entry = table[i].entry; |
if (cmd->entry->key_binding != NULL) |
if (cmd->entry->key_binding != NULL) |
cmd->entry->key_binding(cmd, table[i].key); |
cmd->entry->key_binding(cmd, table[i].key); |
|
|
} |
} |
} |
} |
|
|
void printflike2 |
|
key_bindings_error(struct cmd_ctx *ctx, const char *fmt, ...) |
|
{ |
|
va_list ap; |
|
char *msg; |
|
|
|
if (ctx->curclient->session == NULL) |
|
return; |
|
|
|
va_start(ap, fmt); |
|
xvasprintf(&msg, fmt, ap); |
|
va_end(ap); |
|
|
|
*msg = toupper((u_char) *msg); |
|
status_message_set(ctx->curclient, "%s", msg); |
|
free(msg); |
|
} |
|
|
|
void printflike2 |
|
key_bindings_print(struct cmd_ctx *ctx, const char *fmt, ...) |
|
{ |
|
struct winlink *wl; |
|
va_list ap; |
|
|
|
if (ctx->curclient->session == NULL) |
|
return; |
|
|
|
wl = ctx->curclient->session->curw; |
|
if (wl->window->active->mode != &window_copy_mode) { |
|
window_pane_reset_mode(wl->window->active); |
|
window_pane_set_mode(wl->window->active, &window_copy_mode); |
|
window_copy_init_for_output(wl->window->active); |
|
} |
|
|
|
va_start(ap, fmt); |
|
window_copy_vadd(wl->window->active, fmt, ap); |
|
va_end(ap); |
|
} |
|
|
|
void printflike2 |
|
key_bindings_info(struct cmd_ctx *ctx, const char *fmt, ...) |
|
{ |
|
va_list ap; |
|
char *msg; |
|
|
|
if (ctx->curclient->session == NULL) |
|
return; |
|
|
|
if (options_get_number(&global_options, "quiet")) |
|
return; |
|
|
|
va_start(ap, fmt); |
|
xvasprintf(&msg, fmt, ap); |
|
va_end(ap); |
|
|
|
*msg = toupper((u_char) *msg); |
|
status_message_set(ctx->curclient, "%s", msg); |
|
free(msg); |
|
} |
|
|
|
void |
void |
key_bindings_dispatch(struct key_binding *bd, struct client *c) |
key_bindings_dispatch(struct key_binding *bd, struct client *c) |
{ |
{ |
struct cmd_ctx *ctx; |
|
struct cmd *cmd; |
struct cmd *cmd; |
int readonly; |
int readonly; |
|
|
ctx = cmd_get_ctx(NULL, c); |
|
ctx->error = key_bindings_error; |
|
ctx->print = key_bindings_print; |
|
ctx->info = key_bindings_info; |
|
|
|
readonly = 1; |
readonly = 1; |
TAILQ_FOREACH(cmd, &bd->cmdlist->list, qentry) { |
TAILQ_FOREACH(cmd, &bd->cmdlist->list, qentry) { |
if (!(cmd->entry->flags & CMD_READONLY)) |
if (!(cmd->entry->flags & CMD_READONLY)) |
readonly = 0; |
readonly = 0; |
} |
} |
if (!readonly && c->flags & CLIENT_READONLY) { |
if (!readonly && (c->flags & CLIENT_READONLY)) { |
key_bindings_info(ctx, "client is read-only"); |
cmdq_info(c->cmdq, "client is read-only"); |
return; |
return; |
} |
} |
|
|
cmd_list_exec(bd->cmdlist, ctx); |
cmdq_run(c->cmdq, bd->cmdlist); |
cmd_free_ctx(ctx); |
|
} |
} |