=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window-copy.c,v retrieving revision 1.214 retrieving revision 1.215 diff -c -r1.214 -r1.215 *** src/usr.bin/tmux/window-copy.c 2019/03/27 13:25:11 1.214 --- src/usr.bin/tmux/window-copy.c 2019/04/02 09:03:39 1.215 *************** *** 1,4 **** ! /* $OpenBSD: window-copy.c,v 1.214 2019/03/27 13:25:11 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window-copy.c,v 1.215 2019/04/02 09:03:39 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 79,89 **** static int window_copy_update_selection(struct window_mode_entry *, int); static void window_copy_synchronize_cursor(struct window_mode_entry *); static void *window_copy_get_selection(struct window_mode_entry *, size_t *); ! static void window_copy_copy_buffer(struct window_mode_entry *, void *, ! size_t); static void window_copy_copy_pipe(struct window_mode_entry *, ! struct session *, const char *); ! static void window_copy_copy_selection(struct window_mode_entry *); static void window_copy_append_selection(struct window_mode_entry *); static void window_copy_clear_selection(struct window_mode_entry *); static void window_copy_copy_line(struct window_mode_entry *, char **, --- 79,90 ---- static int window_copy_update_selection(struct window_mode_entry *, int); static void window_copy_synchronize_cursor(struct window_mode_entry *); static void *window_copy_get_selection(struct window_mode_entry *, size_t *); ! static void window_copy_copy_buffer(struct window_mode_entry *, ! const char *, void *, size_t); static void window_copy_copy_pipe(struct window_mode_entry *, ! struct session *, const char *, const char *); ! static void window_copy_copy_selection(struct window_mode_entry *, ! const char *); static void window_copy_append_selection(struct window_mode_entry *); static void window_copy_clear_selection(struct window_mode_entry *); static void window_copy_copy_line(struct window_mode_entry *, char **, *************** *** 164,171 **** --- 165,174 ---- struct window_mode_entry *wme; struct args *args; struct mouse_event *m; + struct client *c; struct session *s; + struct winlink *wl; }; /* *************** *** 673,690 **** window_copy_cmd_copy_end_of_line(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; struct session *s = cs->s; u_int np = wme->prefix; window_copy_start_selection(wme); for (; np > 1; np--) window_copy_cursor_down(wme, 0); window_copy_cursor_end_of_line(wme); if (s != NULL) { ! window_copy_copy_selection(wme); return (WINDOW_COPY_CMD_CANCEL); } return (WINDOW_COPY_CMD_REDRAW); } --- 676,704 ---- window_copy_cmd_copy_end_of_line(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; + struct client *c = cs->c; struct session *s = cs->s; + struct winlink *wl = cs->wl; + struct window_pane *wp = wme->wp; u_int np = wme->prefix; + char *prefix = NULL; + if (cs->args->argc == 2) + prefix = format_single(NULL, cs->args->argv[1], c, s, wl, wp); + window_copy_start_selection(wme); for (; np > 1; np--) window_copy_cursor_down(wme, 0); window_copy_cursor_end_of_line(wme); if (s != NULL) { ! window_copy_copy_selection(wme, prefix); ! ! free(prefix); return (WINDOW_COPY_CMD_CANCEL); } + + free(prefix); return (WINDOW_COPY_CMD_REDRAW); } *************** *** 692,700 **** --- 706,721 ---- window_copy_cmd_copy_line(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; + struct client *c = cs->c; struct session *s = cs->s; + struct winlink *wl = cs->wl; + struct window_pane *wp = wme->wp; u_int np = wme->prefix; + char *prefix = NULL; + if (cs->args->argc == 2) + prefix = format_single(NULL, cs->args->argv[1], c, s, wl, wp); + window_copy_cursor_start_of_line(wme); window_copy_start_selection(wme); for (; np > 1; np--) *************** *** 702,710 **** window_copy_cursor_end_of_line(wme); if (s != NULL) { ! window_copy_copy_selection(wme); return (WINDOW_COPY_CMD_CANCEL); } return (WINDOW_COPY_CMD_REDRAW); } --- 723,735 ---- window_copy_cursor_end_of_line(wme); if (s != NULL) { ! window_copy_copy_selection(wme, prefix); ! ! free(prefix); return (WINDOW_COPY_CMD_CANCEL); } + + free(prefix); return (WINDOW_COPY_CMD_REDRAW); } *************** *** 712,722 **** window_copy_cmd_copy_selection(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; struct session *s = cs->s; if (s != NULL) ! window_copy_copy_selection(wme); window_copy_clear_selection(wme); return (WINDOW_COPY_CMD_REDRAW); } --- 737,756 ---- window_copy_cmd_copy_selection(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; + struct client *c = cs->c; struct session *s = cs->s; + struct winlink *wl = cs->wl; + struct window_pane *wp = wme->wp; + char *prefix = NULL; + if (cs->args->argc == 2) + prefix = format_single(NULL, cs->args->argv[1], c, s, wl, wp); + if (s != NULL) ! window_copy_copy_selection(wme, prefix); window_copy_clear_selection(wme); + + free(prefix); return (WINDOW_COPY_CMD_REDRAW); } *************** *** 724,734 **** window_copy_cmd_copy_selection_and_cancel(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; struct session *s = cs->s; if (s != NULL) ! window_copy_copy_selection(wme); window_copy_clear_selection(wme); return (WINDOW_COPY_CMD_CANCEL); } --- 758,777 ---- window_copy_cmd_copy_selection_and_cancel(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; + struct client *c = cs->c; struct session *s = cs->s; + struct winlink *wl = cs->wl; + struct window_pane *wp = wme->wp; + char *prefix = NULL; + if (cs->args->argc == 2) + prefix = format_single(NULL, cs->args->argv[1], c, s, wl, wp); + if (s != NULL) ! window_copy_copy_selection(wme, prefix); window_copy_clear_selection(wme); + + free(prefix); return (WINDOW_COPY_CMD_CANCEL); } *************** *** 1216,1226 **** window_copy_cmd_copy_pipe(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; struct session *s = cs->s; ! const char *argument = cs->args->argv[1]; ! if (s != NULL && *argument != '\0') ! window_copy_copy_pipe(wme, s, argument); return (WINDOW_COPY_CMD_NOTHING); } --- 1259,1281 ---- window_copy_cmd_copy_pipe(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; + struct client *c = cs->c; struct session *s = cs->s; ! struct winlink *wl = cs->wl; ! struct window_pane *wp = wme->wp; ! char *command = NULL; ! char *prefix = NULL; ! if (cs->args->argc == 3) ! prefix = format_single(NULL, cs->args->argv[2], c, s, wl, wp); ! ! if (s != NULL && *cs->args->argv[1] != '\0') { ! command = format_single(NULL, cs->args->argv[1], c, s, wl, wp); ! window_copy_copy_pipe(wme, s, prefix, command); ! free(command); ! } ! ! free(prefix); return (WINDOW_COPY_CMD_NOTHING); } *************** *** 1228,1240 **** window_copy_cmd_copy_pipe_and_cancel(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; struct session *s = cs->s; ! const char *argument = cs->args->argv[1]; ! if (s != NULL && *argument != '\0') { ! window_copy_copy_pipe(wme, s, argument); return (WINDOW_COPY_CMD_CANCEL); } return (WINDOW_COPY_CMD_NOTHING); } --- 1283,1308 ---- window_copy_cmd_copy_pipe_and_cancel(struct window_copy_cmd_state *cs) { struct window_mode_entry *wme = cs->wme; + struct client *c = cs->c; struct session *s = cs->s; ! struct winlink *wl = cs->wl; ! struct window_pane *wp = wme->wp; ! char *command = NULL; ! char *prefix = NULL; ! if (cs->args->argc == 3) ! prefix = format_single(NULL, cs->args->argv[2], c, s, wl, wp); ! ! if (s != NULL && *cs->args->argv[1] != '\0') { ! command = format_single(NULL, cs->args->argv[1], c, s, wl, wp); ! window_copy_copy_pipe(wme, s, prefix, command); ! free(command); ! ! free(prefix); return (WINDOW_COPY_CMD_CANCEL); } + + free(prefix); return (WINDOW_COPY_CMD_NOTHING); } *************** *** 1278,1284 **** data->jumptype = WINDOW_COPY_JUMPFORWARD; data->jumpchar = *argument; for (; np != 0; np--) ! window_copy_cursor_jump(wme); } return (WINDOW_COPY_CMD_NOTHING); } --- 1346,1352 ---- data->jumptype = WINDOW_COPY_JUMPFORWARD; data->jumpchar = *argument; for (; np != 0; np--) ! window_copy_cursor_jump(wme); } return (WINDOW_COPY_CMD_NOTHING); } *************** *** 1470,1486 **** window_copy_cmd_cancel }, { "clear-selection", 0, 0, window_copy_cmd_clear_selection }, ! { "copy-end-of-line", 0, 0, window_copy_cmd_copy_end_of_line }, ! { "copy-line", 0, 0, window_copy_cmd_copy_line }, ! { "copy-pipe", 1, 1, window_copy_cmd_copy_pipe }, ! { "copy-pipe-and-cancel", 1, 1, window_copy_cmd_copy_pipe_and_cancel }, ! { "copy-selection", 0, 0, window_copy_cmd_copy_selection }, ! { "copy-selection-and-cancel", 0, 0, window_copy_cmd_copy_selection_and_cancel }, { "cursor-down", 0, 0, window_copy_cmd_cursor_down }, --- 1538,1554 ---- window_copy_cmd_cancel }, { "clear-selection", 0, 0, window_copy_cmd_clear_selection }, ! { "copy-end-of-line", 0, 1, window_copy_cmd_copy_end_of_line }, ! { "copy-line", 0, 1, window_copy_cmd_copy_line }, ! { "copy-pipe", 1, 2, window_copy_cmd_copy_pipe }, ! { "copy-pipe-and-cancel", 1, 2, window_copy_cmd_copy_pipe_and_cancel }, ! { "copy-selection", 0, 1, window_copy_cmd_copy_selection }, ! { "copy-selection-and-cancel", 0, 1, window_copy_cmd_copy_selection_and_cancel }, { "cursor-down", 0, 0, window_copy_cmd_cursor_down }, *************** *** 1576,1582 **** static void window_copy_command(struct window_mode_entry *wme, struct client *c, ! struct session *s, __unused struct winlink *wl, struct args *args, struct mouse_event *m) { struct window_copy_mode_data *data = wme->data; --- 1644,1650 ---- static void window_copy_command(struct window_mode_entry *wme, struct client *c, ! struct session *s, struct winlink *wl, struct args *args, struct mouse_event *m) { struct window_copy_mode_data *data = wme->data; *************** *** 1595,1602 **** --- 1663,1672 ---- cs.wme = wme; cs.args = args; cs.m = m; + cs.c = c; cs.s = s; + cs.wl = wl; action = WINDOW_COPY_CMD_NOTHING; for (i = 0; i < nitems(window_copy_cmd_table); i++) { *************** *** 2331,2337 **** } static void ! window_copy_copy_buffer(struct window_mode_entry *wme, void *buf, size_t len) { struct window_pane *wp = wme->wp; struct screen_write_ctx ctx; --- 2401,2408 ---- } static void ! window_copy_copy_buffer(struct window_mode_entry *wme, const char *prefix, ! void *buf, size_t len) { struct window_pane *wp = wme->wp; struct screen_write_ctx ctx; *************** *** 2343,2383 **** notify_pane("pane-set-clipboard", wp); } ! if (paste_set(buf, len, NULL, NULL) != 0) ! free(buf); } static void window_copy_copy_pipe(struct window_mode_entry *wme, struct session *s, ! const char *fmt) { ! struct window_pane *wp = wme->wp; ! void *buf; ! size_t len; ! struct job *job; ! char *expanded; buf = window_copy_get_selection(wme, &len); if (buf == NULL) return; - expanded = format_single(NULL, fmt, NULL, s, NULL, wp); ! job = job_run(expanded, s, NULL, NULL, NULL, NULL, NULL, JOB_NOWAIT); bufferevent_write(job_get_event(job), buf, len); ! ! free(expanded); ! window_copy_copy_buffer(wme, buf, len); } static void ! window_copy_copy_selection(struct window_mode_entry *wme) { char *buf; size_t len; buf = window_copy_get_selection(wme, &len); if (buf != NULL) ! window_copy_copy_buffer(wme, buf, len); } static void --- 2414,2448 ---- notify_pane("pane-set-clipboard", wp); } ! paste_add(prefix, buf, len); } static void window_copy_copy_pipe(struct window_mode_entry *wme, struct session *s, ! const char *prefix, const char *command) { ! void *buf; ! size_t len; ! struct job *job; buf = window_copy_get_selection(wme, &len); if (buf == NULL) return; ! job = job_run(command, s, NULL, NULL, NULL, NULL, NULL, JOB_NOWAIT); bufferevent_write(job_get_event(job), buf, len); ! window_copy_copy_buffer(wme, prefix, buf, len); } static void ! window_copy_copy_selection(struct window_mode_entry *wme, const char *prefix) { char *buf; size_t len; buf = window_copy_get_selection(wme, &len); if (buf != NULL) ! window_copy_copy_buffer(wme, prefix, buf, len); } static void