1 /* Id */
2 
3 /*
4  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 
21 #include <stdlib.h>
22 #include <string.h>
23 
24 #include "tmux.h"
25 
26 /*
27  * Paste paste buffer if present.
28  */
29 
30 enum cmd_retval	 cmd_paste_buffer_exec(struct cmd *, struct cmd_q *);
31 
32 void	cmd_paste_buffer_filter(struct window_pane *,
33 	    const char *, size_t, const char *, int);
34 
35 const struct cmd_entry cmd_paste_buffer_entry = {
36 	"paste-buffer", "pasteb",
37 	"db:prs:t:", 0, 0,
38 	"[-dpr] [-s separator] [-b buffer-index] " CMD_TARGET_PANE_USAGE,
39 	0,
40 	NULL,
41 	cmd_paste_buffer_exec
42 };
43 
44 enum cmd_retval
cmd_paste_buffer_exec(struct cmd * self,struct cmd_q * cmdq)45 cmd_paste_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
46 {
47 	struct args		*args = self->args;
48 	struct window_pane	*wp;
49 	struct session		*s;
50 	struct paste_buffer	*pb;
51 	const char		*sepstr;
52 	char			*cause;
53 	int			 buffer;
54 	int			 pflag;
55 
56 	if (cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp) == NULL)
57 		return (CMD_RETURN_ERROR);
58 
59 	if (!args_has(args, 'b'))
60 		buffer = -1;
61 	else {
62 		buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
63 		if (cause != NULL) {
64 			cmdq_error(cmdq, "buffer %s", cause);
65 			free(cause);
66 			return (CMD_RETURN_ERROR);
67 		}
68 	}
69 
70 	if (buffer == -1)
71 		pb = paste_get_top(&global_buffers);
72 	else {
73 		pb = paste_get_index(&global_buffers, buffer);
74 		if (pb == NULL) {
75 			cmdq_error(cmdq, "no buffer %d", buffer);
76 			return (CMD_RETURN_ERROR);
77 		}
78 	}
79 
80 	if (pb != NULL) {
81 		sepstr = args_get(args, 's');
82 		if (sepstr == NULL) {
83 			if (args_has(args, 'r'))
84 				sepstr = "\n";
85 			else
86 				sepstr = "\r";
87 		}
88 		pflag = (wp->screen->mode & MODE_BRACKETPASTE);
89 		paste_send_pane(pb, wp, sepstr, args_has(args, 'p') && pflag);
90 	}
91 
92 	/* Delete the buffer if -d. */
93 	if (args_has(args, 'd')) {
94 		if (buffer == -1)
95 			paste_free_top(&global_buffers);
96 		else
97 			paste_free_index(&global_buffers, buffer);
98 	}
99 
100 	return (CMD_RETURN_NORMAL);
101 }
102