From 78543cce30245c3450adc31c8787373c5ca93e38 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 21 Mar 2013 18:43:34 +0000 Subject: Support capture-pane -p to send to stdout. --- cmd-capture-pane.c | 57 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 22 deletions(-) (limited to 'cmd-capture-pane.c') diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index 86c614e9..ee42ddee 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -24,15 +24,16 @@ #include "tmux.h" /* - * Write the entire contents of a pane to a buffer. + * Write the entire contents of a pane to a buffer or stdout. */ enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_capture_pane_entry = { "capture-pane", "capturep", - "b:E:S:t:", 0, 0, - "[-b buffer-index] [-E end-line] [-S start-line] " + "b:c:E:pS:t:", 0, 0, + "[-p] [-c target-client] [-b buffer-index] [-E end-line] " + "[-S start-line] " CMD_TARGET_PANE_USAGE, 0, NULL, @@ -44,6 +45,7 @@ enum cmd_retval cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; + struct client *c; struct window_pane *wp; char *buf, *line, *cause; struct screen *s; @@ -52,6 +54,9 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) u_int i, limit, top, bottom, tmp; size_t len, linelen; + if ((c = cmd_find_client(ctx, args_get(args, 'c'))) == NULL) + return (CMD_RETURN_ERROR); + if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL) return (CMD_RETURN_ERROR); s = &wp->base; @@ -100,25 +105,33 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) free(line); } - limit = options_get_number(&global_options, "buffer-limit"); - - if (!args_has(args, 'b')) { - paste_add(&global_buffers, buf, len, limit); - return (CMD_RETURN_NORMAL); - } - - buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause); - if (cause != NULL) { - ctx->error(ctx, "buffer %s", cause); - free(buf); - free(cause); - return (CMD_RETURN_ERROR); - } - - if (paste_replace(&global_buffers, buffer, buf, len) != 0) { - ctx->error(ctx, "no buffer %d", buffer); - free(buf); - return (CMD_RETURN_ERROR); + if (args_has(args, 'p')) { + if (c == NULL) { + ctx->error(ctx, "can't write to stdout"); + return (CMD_RETURN_ERROR); + } + evbuffer_add(c->stdout_data, buf, len); + server_push_stdout(c); + } else { + limit = options_get_number(&global_options, "buffer-limit"); + if (!args_has(args, 'b')) { + paste_add(&global_buffers, buf, len, limit); + return (CMD_RETURN_NORMAL); + } + + buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause); + if (cause != NULL) { + ctx->error(ctx, "buffer %s", cause); + free(buf); + free(cause); + return (CMD_RETURN_ERROR); + } + + if (paste_replace(&global_buffers, buffer, buf, len) != 0) { + ctx->error(ctx, "no buffer %d", buffer); + free(buf); + return (CMD_RETURN_ERROR); + } } return (CMD_RETURN_NORMAL); -- cgit From 8a6fbfa14829ad41b9b6f05f4382d8f4537b7271 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Fri, 22 Mar 2013 15:51:15 +0000 Subject: Don't use a target-client for stdout, just always cmdclient. --- cmd-capture-pane.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'cmd-capture-pane.c') diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index ee42ddee..fa4a5da2 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -31,9 +31,8 @@ enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_capture_pane_entry = { "capture-pane", "capturep", - "b:c:E:pS:t:", 0, 0, - "[-p] [-c target-client] [-b buffer-index] [-E end-line] " - "[-S start-line] " + "b:E:pS:t:", 0, 0, + "[-p] [-b buffer-index] [-E end-line] [-S start-line]" CMD_TARGET_PANE_USAGE, 0, NULL, @@ -45,7 +44,7 @@ enum cmd_retval cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; - struct client *c; + struct client *c = ctx->cmdclient; struct window_pane *wp; char *buf, *line, *cause; struct screen *s; @@ -54,9 +53,6 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) u_int i, limit, top, bottom, tmp; size_t len, linelen; - if ((c = cmd_find_client(ctx, args_get(args, 'c'))) == NULL) - return (CMD_RETURN_ERROR); - if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL) return (CMD_RETURN_ERROR); s = &wp->base; -- cgit From 295d86911e7f7823785d138d96d94ccfa924e29d Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Fri, 22 Mar 2013 15:56:11 +0000 Subject: Add -C and -J to capture pane to escape control sequences and to join wrapped line, based on a diff from George Nachman. --- cmd-capture-pane.c | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) (limited to 'cmd-capture-pane.c') diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index fa4a5da2..6a10b7c9 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -31,8 +31,8 @@ enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *); const struct cmd_entry cmd_capture_pane_entry = { "capture-pane", "capturep", - "b:E:pS:t:", 0, 0, - "[-p] [-b buffer-index] [-E end-line] [-S start-line]" + "b:CeE:JpS:t:", 0, 0, + "[-CeJp] [-b buffer-index] [-E end-line] [-S start-line]" CMD_TARGET_PANE_USAGE, 0, NULL, @@ -44,14 +44,16 @@ enum cmd_retval cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; - struct client *c = ctx->cmdclient; + struct client *c; struct window_pane *wp; - char *buf, *line, *cause; + char *buf, *line, *cause; struct screen *s; struct grid *gd; - int buffer, n; + int buffer, n, with_codes, escape_c0, join_lines; u_int i, limit, top, bottom, tmp; - size_t len, linelen; + size_t len, linelen; + struct grid_cell *gc; + const struct grid_line *gl; if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL) return (CMD_RETURN_ERROR); @@ -89,19 +91,31 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) top = tmp; } + with_codes = args_has(args, 'e'); + escape_c0 = args_has(args, 'C'); + join_lines = args_has(args, 'J'); + + gc = NULL; for (i = top; i <= bottom; i++) { - line = grid_string_cells(s->grid, 0, i, screen_size_x(s)); - linelen = strlen(line); + line = grid_string_cells(s->grid, 0, i, screen_size_x(s), + &gc, with_codes, escape_c0); + linelen = strlen(line); + + buf = xrealloc(buf, 1, len + linelen + 1); + memcpy(buf + len, line, linelen); + len += linelen; - buf = xrealloc(buf, 1, len + linelen + 1); - memcpy(buf + len, line, linelen); - len += linelen; - buf[len++] = '\n'; + gl = grid_peek_line(s->grid, i); + if (!join_lines || !(gl->flags & GRID_LINE_WRAPPED)) + buf[len++] = '\n'; - free(line); + free(line); } if (args_has(args, 'p')) { + c = ctx->curclient; + if (c == NULL || !(c->flags & CLIENT_CONTROL)) + c = ctx->cmdclient; if (c == NULL) { ctx->error(ctx, "can't write to stdout"); return (CMD_RETURN_ERROR); -- cgit From 20636d956dd36c1f14152569a4d44a50eea9083d Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 24 Mar 2013 09:54:10 +0000 Subject: Add a command queue to standardize and simplify commands that call other commands and allow a command to block execution of subsequent commands. This allows run-shell and if-shell to be synchronous which has been much requested. Each client has a default command queue and commands are consumed one at a time from it. A command may suspend execution from the queue by returning CMD_RETURN_WAIT and then resume it by calling cmd_continue() - for example run-shell does this from the callback that is fired after the job is freed. When the command queue becomes empty, command clients are automatically exited (unless attaching). A callback is also fired - this is used for nested commands in, for example, if-shell which can block execution of the client's cmdq until a new cmdq becomes empty. Also merge all the old error/info/print functions together and lose the old curclient/cmdclient distinction - a cmdq is bound to one client (or none if in the configuration file), this is a command client if c->session is NULL otherwise an attached client. --- cmd-capture-pane.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'cmd-capture-pane.c') diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index 6a10b7c9..aa032ce8 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -27,7 +27,7 @@ * Write the entire contents of a pane to a buffer or stdout. */ -enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *); +enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_q *); const struct cmd_entry cmd_capture_pane_entry = { "capture-pane", "capturep", @@ -41,7 +41,7 @@ const struct cmd_entry cmd_capture_pane_entry = { }; enum cmd_retval -cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) +cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq) { struct args *args = self->args; struct client *c; @@ -55,7 +55,7 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) struct grid_cell *gc; const struct grid_line *gl; - if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL) + if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL) return (CMD_RETURN_ERROR); s = &wp->base; gd = s->grid; @@ -113,11 +113,10 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) } if (args_has(args, 'p')) { - c = ctx->curclient; - if (c == NULL || !(c->flags & CLIENT_CONTROL)) - c = ctx->cmdclient; - if (c == NULL) { - ctx->error(ctx, "can't write to stdout"); + c = cmdq->client; + if (c == NULL || + (c->session != NULL && !(c->flags & CLIENT_CONTROL))) { + cmdq_error(cmdq, "can't write to stdout"); return (CMD_RETURN_ERROR); } evbuffer_add(c->stdout_data, buf, len); @@ -131,14 +130,14 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause); if (cause != NULL) { - ctx->error(ctx, "buffer %s", cause); + cmdq_error(cmdq, "buffer %s", cause); free(buf); free(cause); return (CMD_RETURN_ERROR); } if (paste_replace(&global_buffers, buffer, buf, len) != 0) { - ctx->error(ctx, "no buffer %d", buffer); + cmdq_error(cmdq, "no buffer %d", buffer); free(buf); return (CMD_RETURN_ERROR); } -- cgit From e85f764f230c391d072d439cf9e2bea21284c2fe Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 25 Mar 2013 10:05:35 +0000 Subject: Preserve trailing spaces with capture-pane -J, from George Nachman. --- cmd-capture-pane.c | 111 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 48 deletions(-) (limited to 'cmd-capture-pane.c') diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index aa032ce8..f3814f2f 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -31,8 +31,8 @@ enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_q *); const struct cmd_entry cmd_capture_pane_entry = { "capture-pane", "capturep", - "b:CeE:JpS:t:", 0, 0, - "[-CeJp] [-b buffer-index] [-E end-line] [-S start-line]" + "ab:CeE:JpqS:t:", 0, 0, + "[-aCeJpq] [-b buffer-index] [-E end-line] [-S start-line]" CMD_TARGET_PANE_USAGE, 0, NULL, @@ -50,67 +50,82 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq) struct screen *s; struct grid *gd; int buffer, n, with_codes, escape_c0, join_lines; - u_int i, limit, top, bottom, tmp; + u_int i, limit, top, bottom, tmp, sx; size_t len, linelen; struct grid_cell *gc; const struct grid_line *gl; if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL) return (CMD_RETURN_ERROR); - s = &wp->base; - gd = s->grid; + + if (args_has(args, 'a')) { + s = NULL; + gd = wp->saved_grid; + sx = screen_size_x(&wp->base); + if (gd == NULL && !args_has(args, 'q')) { + cmdq_error(cmdq, "no alternate screen"); + return (CMD_RETURN_ERROR); + } + } else { + s = &wp->base; + sx = screen_size_x(s); + gd = s->grid; + } buf = NULL; len = 0; - n = args_strtonum(args, 'S', INT_MIN, SHRT_MAX, &cause); - if (cause != NULL) { - top = gd->hsize; - free(cause); - } else if (n < 0 && (u_int) -n > gd->hsize) - top = 0; - else - top = gd->hsize + n; - if (top > gd->hsize + gd->sy - 1) - top = gd->hsize + gd->sy - 1; - - n = args_strtonum(args, 'E', INT_MIN, SHRT_MAX, &cause); - if (cause != NULL) { - bottom = gd->hsize + gd->sy - 1; - free(cause); - } else if (n < 0 && (u_int) -n > gd->hsize) - bottom = 0; - else - bottom = gd->hsize + n; - if (bottom > gd->hsize + gd->sy - 1) - bottom = gd->hsize + gd->sy - 1; - - if (bottom < top) { - tmp = bottom; - bottom = top; - top = tmp; - } + if (gd != NULL) { + n = args_strtonum(args, 'S', INT_MIN, SHRT_MAX, &cause); + if (cause != NULL) { + top = gd->hsize; + free(cause); + } else if (n < 0 && (u_int) -n > gd->hsize) + top = 0; + else + top = gd->hsize + n; + if (top > gd->hsize + gd->sy - 1) + top = gd->hsize + gd->sy - 1; + + n = args_strtonum(args, 'E', INT_MIN, SHRT_MAX, &cause); + if (cause != NULL) { + bottom = gd->hsize + gd->sy - 1; + free(cause); + } else if (n < 0 && (u_int) -n > gd->hsize) + bottom = 0; + else + bottom = gd->hsize + n; + if (bottom > gd->hsize + gd->sy - 1) + bottom = gd->hsize + gd->sy - 1; + + if (bottom < top) { + tmp = bottom; + bottom = top; + top = tmp; + } - with_codes = args_has(args, 'e'); - escape_c0 = args_has(args, 'C'); - join_lines = args_has(args, 'J'); + with_codes = args_has(args, 'e'); + escape_c0 = args_has(args, 'C'); + join_lines = args_has(args, 'J'); - gc = NULL; - for (i = top; i <= bottom; i++) { - line = grid_string_cells(s->grid, 0, i, screen_size_x(s), - &gc, with_codes, escape_c0); - linelen = strlen(line); + gc = NULL; + for (i = top; i <= bottom; i++) { + line = grid_string_cells(gd, 0, i, sx, &gc, with_codes, + escape_c0, !join_lines); + linelen = strlen(line); - buf = xrealloc(buf, 1, len + linelen + 1); - memcpy(buf + len, line, linelen); - len += linelen; + buf = xrealloc(buf, 1, len + linelen + 1); + memcpy(buf + len, line, linelen); + len += linelen; - gl = grid_peek_line(s->grid, i); - if (!join_lines || !(gl->flags & GRID_LINE_WRAPPED)) - buf[len++] = '\n'; + gl = grid_peek_line(gd, i); + if (!join_lines || !(gl->flags & GRID_LINE_WRAPPED)) + buf[len++] = '\n'; - free(line); - } + free(line); + } + } else + buf = xstrdup(""); if (args_has(args, 'p')) { c = cmdq->client; -- cgit From 270d90ce1e302e7d015abb30342cca0a6ecff048 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 25 Mar 2013 11:42:19 +0000 Subject: Handle empty pending output (not a failure) and add \n. From George Nachman. --- cmd-capture-pane.c | 200 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 128 insertions(+), 72 deletions(-) (limited to 'cmd-capture-pane.c') diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c index f3814f2f..779cbe08 100644 --- a/cmd-capture-pane.c +++ b/cmd-capture-pane.c @@ -29,10 +29,16 @@ enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_q *); +char *cmd_capture_pane_append(char *, size_t *, char *, size_t); +char *cmd_capture_pane_pending(struct args *, struct window_pane *, + size_t *); +char *cmd_capture_pane_history(struct args *, struct cmd_q *, + struct window_pane *, size_t *); + const struct cmd_entry cmd_capture_pane_entry = { "capture-pane", "capturep", - "ab:CeE:JpqS:t:", 0, 0, - "[-aCeJpq] [-b buffer-index] [-E end-line] [-S start-line]" + "ab:CeE:JpPqS:t:", 0, 0, + "[-aCeJpPq] [-b buffer-index] [-E end-line] [-S start-line]" CMD_TARGET_PANE_USAGE, 0, NULL, @@ -40,92 +46,140 @@ const struct cmd_entry cmd_capture_pane_entry = { cmd_capture_pane_exec }; -enum cmd_retval -cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq) +char * +cmd_capture_pane_append(char *buf, size_t *len, char *line, size_t linelen) +{ + buf = xrealloc(buf, 1, *len + linelen + 1); + memcpy(buf + *len, line, linelen); + *len += linelen; + return (buf); +} + +char * +cmd_capture_pane_pending(struct args *args, struct window_pane *wp, + size_t *len) +{ + char *buf, *line, tmp[5]; + size_t linelen; + u_int i; + + if (wp->ictx.since_ground == NULL) + return (xstrdup("")); + + line = EVBUFFER_DATA(wp->ictx.since_ground); + linelen = EVBUFFER_LENGTH(wp->ictx.since_ground); + + buf = xstrdup(""); + if (args_has(args, 'C')) { + for (i = 0; i < linelen; i++) { + if (line[i] >= ' ') { + tmp[0] = line[i]; + tmp[1] = '\0'; + } else + xsnprintf(tmp, sizeof tmp, "\\%03o", line[i]); + buf = cmd_capture_pane_append(buf, len, tmp, + strlen(tmp)); + } + } else + buf = cmd_capture_pane_append(buf, len, line, linelen); + return (buf); +} + +char * +cmd_capture_pane_history(struct args *args, struct cmd_q *cmdq, + struct window_pane *wp, size_t *len) { - struct args *args = self->args; - struct client *c; - struct window_pane *wp; - char *buf, *line, *cause; - struct screen *s; struct grid *gd; - int buffer, n, with_codes, escape_c0, join_lines; - u_int i, limit, top, bottom, tmp, sx; - size_t len, linelen; - struct grid_cell *gc; const struct grid_line *gl; + struct grid_cell *gc = NULL; + int n, with_codes, escape_c0, join_lines; + u_int i, sx, top, bottom, tmp; + char *cause, *buf, *line; + size_t linelen; - if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL) - return (CMD_RETURN_ERROR); - + sx = screen_size_x(&wp->base); if (args_has(args, 'a')) { - s = NULL; gd = wp->saved_grid; - sx = screen_size_x(&wp->base); - if (gd == NULL && !args_has(args, 'q')) { - cmdq_error(cmdq, "no alternate screen"); - return (CMD_RETURN_ERROR); + if (gd == NULL) { + if (!args_has(args, 'q')) { + cmdq_error(cmdq, "no alternate screen"); + return (NULL); + } + return (xstrdup("")); } - } else { - s = &wp->base; - sx = screen_size_x(s); - gd = s->grid; + } else + gd = wp->base.grid; + + n = args_strtonum(args, 'S', INT_MIN, SHRT_MAX, &cause); + if (cause != NULL) { + top = gd->hsize; + free(cause); + } else if (n < 0 && (u_int) -n > gd->hsize) + top = 0; + else + top = gd->hsize + n; + if (top > gd->hsize + gd->sy - 1) + top = gd->hsize + gd->sy - 1; + + n = args_strtonum(args, 'E', INT_MIN, SHRT_MAX, &cause); + if (cause != NULL) { + bottom = gd->hsize + gd->sy - 1; + free(cause); + } else if (n < 0 && (u_int) -n > gd->hsize) + bottom = 0; + else + bottom = gd->hsize + n; + if (bottom > gd->hsize + gd->sy - 1) + bottom = gd->hsize + gd->sy - 1; + + if (bottom < top) { + tmp = bottom; + bottom = top; + top = tmp; } + with_codes = args_has(args, 'e'); + escape_c0 = args_has(args, 'C'); + join_lines = args_has(args, 'J'); + buf = NULL; - len = 0; + for (i = top; i <= bottom; i++) { + line = grid_string_cells(gd, 0, i, sx, &gc, with_codes, + escape_c0, !join_lines); + linelen = strlen(line); - if (gd != NULL) { - n = args_strtonum(args, 'S', INT_MIN, SHRT_MAX, &cause); - if (cause != NULL) { - top = gd->hsize; - free(cause); - } else if (n < 0 && (u_int) -n > gd->hsize) - top = 0; - else - top = gd->hsize + n; - if (top > gd->hsize + gd->sy - 1) - top = gd->hsize + gd->sy - 1; - - n = args_strtonum(args, 'E', INT_MIN, SHRT_MAX, &cause); - if (cause != NULL) { - bottom = gd->hsize + gd->sy - 1; - free(cause); - } else if (n < 0 && (u_int) -n > gd->hsize) - bottom = 0; - else - bottom = gd->hsize + n; - if (bottom > gd->hsize + gd->sy - 1) - bottom = gd->hsize + gd->sy - 1; - - if (bottom < top) { - tmp = bottom; - bottom = top; - top = tmp; - } + buf = cmd_capture_pane_append(buf, len, line, linelen); - with_codes = args_has(args, 'e'); - escape_c0 = args_has(args, 'C'); - join_lines = args_has(args, 'J'); + gl = grid_peek_line(gd, i); + if (!join_lines || !(gl->flags & GRID_LINE_WRAPPED)) + buf[(*len)++] = '\n'; - gc = NULL; - for (i = top; i <= bottom; i++) { - line = grid_string_cells(gd, 0, i, sx, &gc, with_codes, - escape_c0, !join_lines); - linelen = strlen(line); + free(line); + } + return (buf); +} - buf = xrealloc(buf, 1, len + linelen + 1); - memcpy(buf + len, line, linelen); - len += linelen; +enum cmd_retval +cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq) +{ + struct args *args = self->args; + struct client *c; + struct window_pane *wp; + char *buf, *cause; + int buffer; + u_int limit; + size_t len; - gl = grid_peek_line(gd, i); - if (!join_lines || !(gl->flags & GRID_LINE_WRAPPED)) - buf[len++] = '\n'; + if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL) + return (CMD_RETURN_ERROR); - free(line); - } - } else - buf = xstrdup(""); + len = 0; + if (args_has(args, 'P')) + buf = cmd_capture_pane_pending(args, wp, &len); + else + buf = cmd_capture_pane_history(args, cmdq, wp, &len); + if (buf == NULL) + return (CMD_RETURN_ERROR); if (args_has(args, 'p')) { c = cmdq->client; @@ -135,6 +189,8 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq) return (CMD_RETURN_ERROR); } evbuffer_add(c->stdout_data, buf, len); + if (args_has(args, 'P') && len > 0) + evbuffer_add(c->stdout_data, "\n", 1); server_push_stdout(c); } else { limit = options_get_number(&global_options, "buffer-limit"); -- cgit