version 1.202, 2018/10/03 15:27:55 |
version 1.203, 2018/11/08 18:49:19 |
|
|
static int window_copy_update_selection(struct window_pane *, int); |
static int window_copy_update_selection(struct window_pane *, int); |
static void window_copy_synchronize_cursor(struct window_pane *); |
static void window_copy_synchronize_cursor(struct window_pane *); |
static void *window_copy_get_selection(struct window_pane *, size_t *); |
static void *window_copy_get_selection(struct window_pane *, size_t *); |
static void window_copy_copy_buffer(struct window_pane *, const char *, |
static void window_copy_copy_buffer(struct window_pane *, void *, size_t); |
void *, size_t); |
|
static void window_copy_copy_pipe(struct window_pane *, struct session *, |
static void window_copy_copy_pipe(struct window_pane *, struct session *, |
const char *, const char *); |
|
static void window_copy_copy_selection(struct window_pane *, const char *); |
|
static void window_copy_append_selection(struct window_pane *, |
|
const char *); |
const char *); |
|
static void window_copy_copy_selection(struct window_pane *); |
|
static void window_copy_append_selection(struct window_pane *); |
static void window_copy_clear_selection(struct window_pane *); |
static void window_copy_clear_selection(struct window_pane *); |
static void window_copy_copy_line(struct window_pane *, char **, size_t *, |
static void window_copy_copy_line(struct window_pane *, char **, size_t *, |
u_int, u_int, u_int); |
u_int, u_int, u_int); |
|
|
if (args->argc == 1) { |
if (args->argc == 1) { |
if (strcmp(command, "append-selection") == 0) { |
if (strcmp(command, "append-selection") == 0) { |
if (s != NULL) |
if (s != NULL) |
window_copy_append_selection(wp, NULL); |
window_copy_append_selection(wp); |
window_copy_clear_selection(wp); |
window_copy_clear_selection(wp); |
redraw = 1; |
redraw = 1; |
} |
} |
if (strcmp(command, "append-selection-and-cancel") == 0) { |
if (strcmp(command, "append-selection-and-cancel") == 0) { |
if (s != NULL) |
if (s != NULL) |
window_copy_append_selection(wp, NULL); |
window_copy_append_selection(wp); |
window_copy_clear_selection(wp); |
window_copy_clear_selection(wp); |
redraw = 1; |
redraw = 1; |
cancel = 1; |
cancel = 1; |
|
|
redraw = 1; |
redraw = 1; |
|
|
if (s != NULL) { |
if (s != NULL) { |
window_copy_copy_selection(wp, NULL); |
window_copy_copy_selection(wp); |
cancel = 1; |
cancel = 1; |
} |
} |
} |
} |
|
|
redraw = 1; |
redraw = 1; |
|
|
if (s != NULL) { |
if (s != NULL) { |
window_copy_copy_selection(wp, NULL); |
window_copy_copy_selection(wp); |
cancel = 1; |
cancel = 1; |
} |
} |
} |
} |
if (strcmp(command, "copy-selection") == 0) { |
if (strcmp(command, "copy-selection") == 0) { |
if (s != NULL) |
if (s != NULL) |
window_copy_copy_selection(wp, NULL); |
window_copy_copy_selection(wp); |
window_copy_clear_selection(wp); |
window_copy_clear_selection(wp); |
redraw = 1; |
redraw = 1; |
} |
} |
if (strcmp(command, "copy-selection-and-cancel") == 0) { |
if (strcmp(command, "copy-selection-and-cancel") == 0) { |
if (s != NULL) |
if (s != NULL) |
window_copy_copy_selection(wp, NULL); |
window_copy_copy_selection(wp); |
window_copy_clear_selection(wp); |
window_copy_clear_selection(wp); |
redraw = 1; |
redraw = 1; |
cancel = 1; |
cancel = 1; |
|
|
argument = args->argv[1]; |
argument = args->argv[1]; |
if (strcmp(command, "copy-pipe") == 0) { |
if (strcmp(command, "copy-pipe") == 0) { |
if (s != NULL) |
if (s != NULL) |
window_copy_copy_pipe(wp, s, NULL, argument); |
window_copy_copy_pipe(wp, s, argument); |
} |
} |
if (strcmp(command, "copy-pipe-and-cancel") == 0) { |
if (strcmp(command, "copy-pipe-and-cancel") == 0) { |
if (s != NULL) { |
if (s != NULL) { |
window_copy_copy_pipe(wp, s, NULL, argument); |
window_copy_copy_pipe(wp, s, argument); |
cancel = 1; |
cancel = 1; |
} |
} |
} |
} |
|
|
} |
} |
|
|
static void |
static void |
window_copy_copy_buffer(struct window_pane *wp, const char *bufname, void *buf, |
window_copy_copy_buffer(struct window_pane *wp, void *buf, size_t len) |
size_t len) |
|
{ |
{ |
struct screen_write_ctx ctx; |
struct screen_write_ctx ctx; |
|
|
|
|
notify_pane("pane-set-clipboard", wp); |
notify_pane("pane-set-clipboard", wp); |
} |
} |
|
|
if (paste_set(buf, len, bufname, NULL) != 0) |
if (paste_set(buf, len, NULL, NULL) != 0) |
free(buf); |
free(buf); |
} |
} |
|
|
static void |
static void |
window_copy_copy_pipe(struct window_pane *wp, struct session *s, |
window_copy_copy_pipe(struct window_pane *wp, struct session *s, |
const char *bufname, const char *arg) |
const char *fmt) |
{ |
{ |
void *buf; |
void *buf; |
size_t len; |
size_t len; |
|
|
buf = window_copy_get_selection(wp, &len); |
buf = window_copy_get_selection(wp, &len); |
if (buf == NULL) |
if (buf == NULL) |
return; |
return; |
expanded = format_single(NULL, arg, NULL, s, NULL, wp); |
expanded = format_single(NULL, fmt, NULL, s, NULL, wp); |
|
|
job = job_run(expanded, s, NULL, NULL, NULL, NULL, NULL, JOB_NOWAIT); |
job = job_run(expanded, s, NULL, NULL, NULL, NULL, NULL, JOB_NOWAIT); |
bufferevent_write(job_get_event(job), buf, len); |
bufferevent_write(job_get_event(job), buf, len); |
|
|
free(expanded); |
free(expanded); |
window_copy_copy_buffer(wp, bufname, buf, len); |
window_copy_copy_buffer(wp, buf, len); |
} |
} |
|
|
static void |
static void |
window_copy_copy_selection(struct window_pane *wp, const char *bufname) |
window_copy_copy_selection(struct window_pane *wp) |
{ |
{ |
void *buf; |
char *buf; |
size_t len; |
size_t len; |
|
|
buf = window_copy_get_selection(wp, &len); |
buf = window_copy_get_selection(wp, &len); |
if (buf == NULL) |
if (buf != NULL) |
return; |
window_copy_copy_buffer(wp, buf, len); |
|
|
window_copy_copy_buffer(wp, bufname, buf, len); |
|
} |
} |
|
|
static void |
static void |
window_copy_append_selection(struct window_pane *wp, const char *bufname) |
window_copy_append_selection(struct window_pane *wp) |
{ |
{ |
char *buf; |
char *buf; |
struct paste_buffer *pb; |
struct paste_buffer *pb; |
const char *bufdata; |
const char *bufdata, *bufname; |
size_t len, bufsize; |
size_t len, bufsize; |
struct screen_write_ctx ctx; |
struct screen_write_ctx ctx; |
|
|
|
|
notify_pane("pane-set-clipboard", wp); |
notify_pane("pane-set-clipboard", wp); |
} |
} |
|
|
if (bufname == NULL || *bufname == '\0') |
pb = paste_get_top(&bufname); |
pb = paste_get_top(&bufname); |
|
else |
|
pb = paste_get_name(bufname); |
|
if (pb != NULL) { |
if (pb != NULL) { |
bufdata = paste_buffer_data(pb, &bufsize); |
bufdata = paste_buffer_data(pb, &bufsize); |
buf = xrealloc(buf, len + bufsize); |
buf = xrealloc(buf, len + bufsize); |