From 5b6f78186c63a19e213eb8597efe69277556e038 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 25 Jun 2012 14:08:55 +0000 Subject: Clean up and simplify the choose mode code, from Thomas Adam. --- cmd-choose-buffer.c | 90 +++++++++++++++++------------------------------------ 1 file changed, 29 insertions(+), 61 deletions(-) (limited to 'cmd-choose-buffer.c') diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c index 9045d9eb..edef4d46 100644 --- a/cmd-choose-buffer.c +++ b/cmd-choose-buffer.c @@ -28,8 +28,8 @@ int cmd_choose_buffer_exec(struct cmd *, struct cmd_ctx *); -void cmd_choose_buffer_callback(void *, int); -void cmd_choose_buffer_free(void *); +void cmd_choose_buffer_callback(struct window_choose_data *); +void cmd_choose_buffer_free(struct window_choose_data *); const struct cmd_entry cmd_choose_buffer_entry = { "choose-buffer", NULL, @@ -41,21 +41,14 @@ const struct cmd_entry cmd_choose_buffer_entry = { cmd_choose_buffer_exec }; -struct cmd_choose_buffer_data { - struct client *client; - char *template; -}; - int cmd_choose_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; - struct cmd_choose_buffer_data *cdata; + struct window_choose_data *cdata; struct winlink *wl; struct paste_buffer *pb; - struct format_tree *ft; u_int idx; - char *line; const char *template; if (ctx->curclient == NULL) { @@ -77,77 +70,52 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) idx = 0; while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) { - ft = format_create(); - format_add(ft, "line", "%u", idx - 1); - format_paste_buffer(ft, pb); + cdata = window_choose_data_create(ctx); + if (args->argc != 0) + cdata->action = xstrdup(args->argv[0]); + else + cdata->action = xstrdup("paste-buffer -b '%%'"); - line = format_expand(ft, template); - window_choose_add(wl->window->active, idx - 1, "%s", line); + cdata->idx = idx - 1; + cdata->client->references++; - xfree(line); - format_free(ft); - } + cdata->ft_template = xstrdup(template); + format_add(cdata->ft, "line", "%u", idx - 1); + format_paste_buffer(cdata->ft, pb); - 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_add(wl->window->active, cdata); + } 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); } 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; - struct cmd_list *cmdlist; - struct cmd_ctx ctx; - char *template, *cause, tmp[16]; - - if (idx == -1) + if (cdata == NULL) return; if (cdata->client->flags & CLIENT_DEAD) return; - xsnprintf(tmp, sizeof tmp, "%u", idx); - template = cmd_template_replace(cdata->template, tmp, 1); - - 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); + xasprintf(&cdata->raw_format, "%u", cdata->idx); + window_choose_ctx(cdata); } 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--; - xfree(cdata->template); + + xfree(cdata->ft_template); + xfree(cdata->action); + xfree(cdata->raw_format); xfree(cdata); } -- cgit v1.2.3