version 1.5, 2012/05/22 11:35:37 |
version 1.6, 2012/06/25 14:08:55 |
|
|
|
|
int cmd_choose_buffer_exec(struct cmd *, struct cmd_ctx *); |
int cmd_choose_buffer_exec(struct cmd *, struct cmd_ctx *); |
|
|
void cmd_choose_buffer_callback(void *, int); |
void cmd_choose_buffer_callback(struct window_choose_data *); |
void cmd_choose_buffer_free(void *); |
void cmd_choose_buffer_free(struct window_choose_data *); |
|
|
const struct cmd_entry cmd_choose_buffer_entry = { |
const struct cmd_entry cmd_choose_buffer_entry = { |
"choose-buffer", NULL, |
"choose-buffer", NULL, |
|
|
cmd_choose_buffer_exec |
cmd_choose_buffer_exec |
}; |
}; |
|
|
struct cmd_choose_buffer_data { |
|
struct client *client; |
|
char *template; |
|
}; |
|
|
|
int |
int |
cmd_choose_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) |
cmd_choose_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) |
{ |
{ |
struct args *args = self->args; |
struct args *args = self->args; |
struct cmd_choose_buffer_data *cdata; |
struct window_choose_data *cdata; |
struct winlink *wl; |
struct winlink *wl; |
struct paste_buffer *pb; |
struct paste_buffer *pb; |
struct format_tree *ft; |
|
u_int idx; |
u_int idx; |
char *line; |
|
const char *template; |
const char *template; |
|
|
if (ctx->curclient == NULL) { |
if (ctx->curclient == NULL) { |
|
|
|
|
idx = 0; |
idx = 0; |
while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) { |
while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) { |
ft = format_create(); |
cdata = window_choose_data_create(ctx); |
format_add(ft, "line", "%u", idx - 1); |
if (args->argc != 0) |
format_paste_buffer(ft, pb); |
cdata->action = xstrdup(args->argv[0]); |
|
else |
|
cdata->action = xstrdup("paste-buffer -b '%%'"); |
|
|
line = format_expand(ft, template); |
cdata->idx = idx - 1; |
window_choose_add(wl->window->active, idx - 1, "%s", line); |
cdata->client->references++; |
|
|
xfree(line); |
cdata->ft_template = xstrdup(template); |
format_free(ft); |
format_add(cdata->ft, "line", "%u", idx - 1); |
|
format_paste_buffer(cdata->ft, pb); |
|
|
|
window_choose_add(wl->window->active, cdata); |
} |
} |
|
|
cdata = xmalloc(sizeof *cdata); |
|
if (args->argc != 0) |
|
cdata->template = xstrdup(args->argv[0]); |
|
else |
|
cdata->template = xstrdup("paste-buffer -b '%%'"); |
|
cdata->client = ctx->curclient; |
|
cdata->client->references++; |
|
|
|
window_choose_ready(wl->window->active, |
window_choose_ready(wl->window->active, |
0, cmd_choose_buffer_callback, cmd_choose_buffer_free, cdata); |
0, cmd_choose_buffer_callback, cmd_choose_buffer_free); |
|
|
return (0); |
return (0); |
} |
} |
|
|
void |
void |
cmd_choose_buffer_callback(void *data, int idx) |
cmd_choose_buffer_callback(struct window_choose_data *cdata) |
{ |
{ |
struct cmd_choose_buffer_data *cdata = data; |
if (cdata == NULL) |
struct cmd_list *cmdlist; |
|
struct cmd_ctx ctx; |
|
char *template, *cause, tmp[16]; |
|
|
|
if (idx == -1) |
|
return; |
return; |
if (cdata->client->flags & CLIENT_DEAD) |
if (cdata->client->flags & CLIENT_DEAD) |
return; |
return; |
|
|
xsnprintf(tmp, sizeof tmp, "%u", idx); |
xasprintf(&cdata->raw_format, "%u", cdata->idx); |
template = cmd_template_replace(cdata->template, tmp, 1); |
window_choose_ctx(cdata); |
|
|
if (cmd_string_parse(template, &cmdlist, &cause) != 0) { |
|
if (cause != NULL) { |
|
*cause = toupper((u_char) *cause); |
|
status_message_set(cdata->client, "%s", cause); |
|
xfree(cause); |
|
} |
|
xfree(template); |
|
return; |
|
} |
|
xfree(template); |
|
|
|
ctx.msgdata = NULL; |
|
ctx.curclient = cdata->client; |
|
|
|
ctx.error = key_bindings_error; |
|
ctx.print = key_bindings_print; |
|
ctx.info = key_bindings_info; |
|
|
|
ctx.cmdclient = NULL; |
|
|
|
cmd_list_exec(cmdlist, &ctx); |
|
cmd_list_free(cmdlist); |
|
} |
} |
|
|
void |
void |
cmd_choose_buffer_free(void *data) |
cmd_choose_buffer_free(struct window_choose_data *data) |
{ |
{ |
struct cmd_choose_buffer_data *cdata = data; |
struct window_choose_data *cdata = data; |
|
|
|
if (cdata == NULL) |
|
return; |
|
|
cdata->client->references--; |
cdata->client->references--; |
xfree(cdata->template); |
|
|
xfree(cdata->ft_template); |
|
xfree(cdata->action); |
|
xfree(cdata->raw_format); |
xfree(cdata); |
xfree(cdata); |
} |
} |