=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/Attic/cmd-choose-buffer.c,v retrieving revision 1.5 retrieving revision 1.6 diff -c -r1.5 -r1.6 *** src/usr.bin/tmux/Attic/cmd-choose-buffer.c 2012/05/22 11:35:37 1.5 --- src/usr.bin/tmux/Attic/cmd-choose-buffer.c 2012/06/25 14:08:55 1.6 *************** *** 1,4 **** ! /* $OpenBSD: cmd-choose-buffer.c,v 1.5 2012/05/22 11:35:37 nicm Exp $ */ /* * Copyright (c) 2010 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-choose-buffer.c,v 1.6 2012/06/25 14:08:55 nicm Exp $ */ /* * Copyright (c) 2010 Nicholas Marriott *************** *** 28,35 **** int cmd_choose_buffer_exec(struct cmd *, struct cmd_ctx *); ! void cmd_choose_buffer_callback(void *, int); ! void cmd_choose_buffer_free(void *); const struct cmd_entry cmd_choose_buffer_entry = { "choose-buffer", NULL, --- 28,35 ---- int cmd_choose_buffer_exec(struct cmd *, struct cmd_ctx *); ! 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,61 **** 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 winlink *wl; struct paste_buffer *pb; - struct format_tree *ft; u_int idx; - char *line; const char *template; if (ctx->curclient == NULL) { --- 41,54 ---- cmd_choose_buffer_exec }; int cmd_choose_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; ! struct window_choose_data *cdata; struct winlink *wl; struct paste_buffer *pb; u_int idx; const char *template; if (ctx->curclient == NULL) { *************** *** 77,153 **** 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); ! line = format_expand(ft, template); ! window_choose_add(wl->window->active, idx - 1, "%s", line); ! xfree(line); ! format_free(ft); } - 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, ! 0, cmd_choose_buffer_callback, cmd_choose_buffer_free, cdata); return (0); } void ! cmd_choose_buffer_callback(void *data, int idx) { ! struct cmd_choose_buffer_data *cdata = data; ! struct cmd_list *cmdlist; ! struct cmd_ctx ctx; ! char *template, *cause, tmp[16]; ! ! if (idx == -1) 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); } void ! cmd_choose_buffer_free(void *data) { ! struct cmd_choose_buffer_data *cdata = data; cdata->client->references--; ! xfree(cdata->template); xfree(cdata); } --- 70,121 ---- idx = 0; while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) { ! cdata = window_choose_data_create(ctx); ! if (args->argc != 0) ! cdata->action = xstrdup(args->argv[0]); ! else ! cdata->action = xstrdup("paste-buffer -b '%%'"); ! cdata->idx = idx - 1; ! cdata->client->references++; ! cdata->ft_template = xstrdup(template); ! format_add(cdata->ft, "line", "%u", idx - 1); ! format_paste_buffer(cdata->ft, pb); ! ! window_choose_add(wl->window->active, cdata); } window_choose_ready(wl->window->active, ! 0, cmd_choose_buffer_callback, cmd_choose_buffer_free); return (0); } void ! cmd_choose_buffer_callback(struct window_choose_data *cdata) { ! if (cdata == NULL) return; if (cdata->client->flags & CLIENT_DEAD) return; ! xasprintf(&cdata->raw_format, "%u", cdata->idx); ! window_choose_ctx(cdata); } void ! cmd_choose_buffer_free(struct window_choose_data *data) { ! struct window_choose_data *cdata = data; + if (cdata == NULL) + return; + cdata->client->references--; ! ! xfree(cdata->ft_template); ! xfree(cdata->action); ! xfree(cdata->raw_format); xfree(cdata); }