Merge branch 'obsd-master'
[tmux.git] / cmd-copy-mode.c
blob5e9b444e2f33db8ee35d66084c8e95d919883604
1 /* $OpenBSD$ */
3 /*
4 * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
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.
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.
19 #include <sys/types.h>
21 #include "tmux.h"
24 * Enter copy or clock mode.
27 static enum cmd_retval cmd_copy_mode_exec(struct cmd *, struct cmdq_item *);
29 const struct cmd_entry cmd_copy_mode_entry = {
30 .name = "copy-mode",
31 .alias = NULL,
33 .args = { "deHMs:t:uq", 0, 0, NULL },
34 .usage = "[-deHMuq] [-s src-pane] " CMD_TARGET_PANE_USAGE,
36 .source = { 's', CMD_FIND_PANE, 0 },
37 .target = { 't', CMD_FIND_PANE, 0 },
39 .flags = CMD_AFTERHOOK,
40 .exec = cmd_copy_mode_exec
43 const struct cmd_entry cmd_clock_mode_entry = {
44 .name = "clock-mode",
45 .alias = NULL,
47 .args = { "t:", 0, 0, NULL },
48 .usage = CMD_TARGET_PANE_USAGE,
50 .target = { 't', CMD_FIND_PANE, 0 },
52 .flags = CMD_AFTERHOOK,
53 .exec = cmd_copy_mode_exec
56 static enum cmd_retval
57 cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item)
59 struct args *args = cmd_get_args(self);
60 struct key_event *event = cmdq_get_event(item);
61 struct cmd_find_state *source = cmdq_get_source(item);
62 struct cmd_find_state *target = cmdq_get_target(item);
63 struct client *c = cmdq_get_client(item);
64 struct session *s;
65 struct window_pane *wp = target->wp, *swp;
67 if (args_has(args, 'q')) {
68 window_pane_reset_mode_all(wp);
69 return (CMD_RETURN_NORMAL);
72 if (args_has(args, 'M')) {
73 if ((wp = cmd_mouse_pane(&event->m, &s, NULL)) == NULL)
74 return (CMD_RETURN_NORMAL);
75 if (c == NULL || c->session != s)
76 return (CMD_RETURN_NORMAL);
79 if (cmd_get_entry(self) == &cmd_clock_mode_entry) {
80 window_pane_set_mode(wp, NULL, &window_clock_mode, NULL, NULL);
81 return (CMD_RETURN_NORMAL);
84 if (args_has(args, 's'))
85 swp = source->wp;
86 else
87 swp = wp;
88 if (!window_pane_set_mode(wp, swp, &window_copy_mode, NULL, args)) {
89 if (args_has(args, 'M'))
90 window_copy_start_drag(c, &event->m);
92 if (args_has(args, 'u'))
93 window_copy_pageup(wp, 0);
94 if (args_has(args, 'd'))
95 window_copy_pagedown(wp, 0, args_has(args, 'e'));
97 return (CMD_RETURN_NORMAL);