From cc42614fa92a0fd93ae359af6562401a2d3d00d7 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 30 Dec 2010 23:16:18 +0000 Subject: Change from a per-session stack of buffers to one global stack which is much more convenient and also simplifies lot of code. This renders copy-buffer useless and makes buffer-limit now a server option. By Tiago Cunha. --- cmd-capture-pane.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 105 insertions(+), 16 deletions(-) (limited to 'cmd-capture-pane.c') diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index 4d551706..df5875e7 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -18,6 +18,7 @@ #include +#include #include #include "tmux.h" @@ -26,31 +27,93 @@ * Write the entire contents of a pane to a buffer. */ +int cmd_capture_pane_parse(struct cmd *, int, char **, char **); int cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *); +void cmd_capture_pane_free(struct cmd *); +void cmd_capture_pane_init(struct cmd *, int); +size_t cmd_capture_pane_print(struct cmd *, char *, size_t); + +struct cmd_capture_pane_data { + char *target; + int buffer; +}; const struct cmd_entry cmd_capture_pane_entry = { "capture-pane", "capturep", CMD_BUFFER_PANE_USAGE, 0, "", - cmd_buffer_init, - cmd_buffer_parse, + cmd_capture_pane_init, + cmd_capture_pane_parse, cmd_capture_pane_exec, - cmd_buffer_free, - cmd_buffer_print + cmd_capture_pane_free, + cmd_capture_pane_print }; +/* ARGSUSED */ +void +cmd_capture_pane_init(struct cmd *self, unused int arg) +{ + struct cmd_capture_pane_data *data; + + self->data = data = xmalloc(sizeof *data); + data->buffer = -1; + data->target = NULL; +} + +int +cmd_capture_pane_parse(struct cmd *self, int argc, char **argv, char **cause) +{ + struct cmd_capture_pane_data *data; + const char *errstr; + int n, opt; + + self->entry->init(self, KEYC_NONE); + data = self->data; + + while ((opt = getopt(argc, argv, "b:t:")) != -1) { + switch (opt) { + case 'b': + if (data->buffer == -1) { + n = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr != NULL) { + xasprintf(cause, "buffer %s", errstr); + goto error; + } + data->buffer = n; + } + break; + case 't': + if (data->target == NULL) + data->target = xstrdup(optarg); + break; + default: + goto usage; + } + } + argc -= optind; + argv += optind; + + return (0); + +usage: + xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage); + +error: + self->entry->free(self); + return (-1); +} + int cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) { - struct cmd_buffer_data *data = self->data; - struct window_pane *wp; - char *buf, *line; - struct screen *s; - struct session *sess; - u_int i, limit; - size_t len, linelen; - - if (cmd_find_pane(ctx, data->target, &sess, &wp) == NULL) + struct cmd_capture_pane_data *data = self->data; + struct window_pane *wp; + char *buf, *line; + struct screen *s; + u_int i, limit; + size_t len, linelen; + + if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL) return (-1); s = &wp->base; @@ -69,15 +132,41 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) xfree(line); } - limit = options_get_number(&sess->options, "buffer-limit"); + limit = options_get_number(&global_options, "buffer-limit"); if (data->buffer == -1) { - paste_add(&sess->buffers, buf, len, limit); + paste_add(&global_buffers, buf, len, limit); return (0); } - if (paste_replace(&sess->buffers, data->buffer, buf, len) != 0) { + if (paste_replace(&global_buffers, data->buffer, buf, len) != 0) { ctx->error(ctx, "no buffer %d", data->buffer); xfree(buf); return (-1); } return (0); } + +void +cmd_capture_pane_free(struct cmd *self) +{ + struct cmd_capture_pane_data *data = self->data; + + if (data->target != NULL) + xfree(data->target); + xfree(data); +} + +size_t +cmd_capture_pane_print(struct cmd *self, char *buf, size_t len) +{ + struct cmd_capture_pane_data *data = self->data; + size_t off = 0; + + off += xsnprintf(buf, len, "%s", self->entry->name); + if (data == NULL) + return (off); + if (off < len && data->buffer != -1) + off += xsnprintf(buf + off, len - off, " -b %d", data->buffer); + if (off < len && data->target != NULL) + off += xsnprintf(buf + off, len - off, " -t %s", data->target); + return (off); +} -- cgit