1/* $OpenBSD$ */
2
3/*
4 * Copyright (c) 2007 Nicholas Marriott <[email protected]>
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 "tmux.h"
22
23/*
24 * Enter copy or clock mode.
25 */
26
27static enum cmd_retval cmd_copy_mode_exec(struct cmd *, struct cmdq_item *);
28
29const struct cmd_entry cmd_copy_mode_entry = {
30 .name = "copy-mode",
31 .alias = NULL,
32
33 .args = { "eHMt:uq", 0, 0 },
34 .usage = "[-eHMuq] " CMD_TARGET_PANE_USAGE,
35
36 .target = { 't', CMD_FIND_PANE, 0 },
37
38 .flags = CMD_AFTERHOOK,
39 .exec = cmd_copy_mode_exec
40};
41
42const struct cmd_entry cmd_clock_mode_entry = {
43 .name = "clock-mode",
44 .alias = NULL,
45
46 .args = { "t:", 0, 0 },
47 .usage = CMD_TARGET_PANE_USAGE,
48
49 .target = { 't', CMD_FIND_PANE, 0 },
50
51 .flags = CMD_AFTERHOOK,
52 .exec = cmd_copy_mode_exec
53};
54
55static enum cmd_retval
56cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item)
57{
58 struct args *args = self->args;
59 struct cmdq_shared *shared = item->shared;
60 struct client *c = item->client;
61 struct session *s;
62 struct window_pane *wp = item->target.wp;
63
64 if (args_has(args, 'q')) {
65 window_pane_reset_mode_all(wp);
66 return (CMD_RETURN_NORMAL);
67 }
68
69 if (args_has(args, 'M')) {
70 if ((wp = cmd_mouse_pane(&shared->mouse, &s, NULL)) == NULL)
71 return (CMD_RETURN_NORMAL);
72 if (c == NULL || c->session != s)
73 return (CMD_RETURN_NORMAL);
74 }
75
76 if (self->entry == &cmd_clock_mode_entry) {
77 window_pane_set_mode(wp, &window_clock_mode, NULL, NULL);
78 return (CMD_RETURN_NORMAL);
79 }
80
81 if (!window_pane_set_mode(wp, &window_copy_mode, NULL, args)) {
82 if (args_has(args, 'M'))
83 window_copy_start_drag(c, &shared->mouse);
84 }
85 if (args_has(self->args, 'u'))
86 window_copy_pageup(wp, 0);
87
88 return (CMD_RETURN_NORMAL);
89}
90