version 1.3, 2010/01/20 18:30:20 |
version 1.4, 2010/12/30 23:16:18 |
|
|
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
|
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
* Write the entire contents of a pane to a buffer. |
* 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 *); |
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 = { |
const struct cmd_entry cmd_capture_pane_entry = { |
"capture-pane", "capturep", |
"capture-pane", "capturep", |
CMD_BUFFER_PANE_USAGE, |
CMD_BUFFER_PANE_USAGE, |
0, "", |
0, "", |
cmd_buffer_init, |
cmd_capture_pane_init, |
cmd_buffer_parse, |
cmd_capture_pane_parse, |
cmd_capture_pane_exec, |
cmd_capture_pane_exec, |
cmd_buffer_free, |
cmd_capture_pane_free, |
cmd_buffer_print |
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 |
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) |
cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) |
{ |
{ |
struct cmd_buffer_data *data = self->data; |
struct cmd_capture_pane_data *data = self->data; |
struct window_pane *wp; |
struct window_pane *wp; |
char *buf, *line; |
char *buf, *line; |
struct screen *s; |
struct screen *s; |
struct session *sess; |
u_int i, limit; |
u_int i, limit; |
size_t len, linelen; |
size_t len, linelen; |
|
|
|
if (cmd_find_pane(ctx, data->target, &sess, &wp) == NULL) |
if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL) |
return (-1); |
return (-1); |
s = &wp->base; |
s = &wp->base; |
|
|
|
|
xfree(line); |
xfree(line); |
} |
} |
|
|
limit = options_get_number(&sess->options, "buffer-limit"); |
limit = options_get_number(&global_options, "buffer-limit"); |
if (data->buffer == -1) { |
if (data->buffer == -1) { |
paste_add(&sess->buffers, buf, len, limit); |
paste_add(&global_buffers, buf, len, limit); |
return (0); |
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); |
ctx->error(ctx, "no buffer %d", data->buffer); |
xfree(buf); |
xfree(buf); |
return (-1); |
return (-1); |
} |
} |
return (0); |
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); |
} |
} |