xref: /netbsd-src/external/bsd/tmux/dist/cmd-copy-mode.c (revision f8cf1a9151c7af1cb0bd8b09c13c66bca599c027)
15494e770Schristos /* $OpenBSD$ */
2698d5317Sjmmv 
3698d5317Sjmmv /*
4ed4e6cd4Schristos  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
5698d5317Sjmmv  *
6698d5317Sjmmv  * Permission to use, copy, modify, and distribute this software for any
7698d5317Sjmmv  * purpose with or without fee is hereby granted, provided that the above
8698d5317Sjmmv  * copyright notice and this permission notice appear in all copies.
9698d5317Sjmmv  *
10698d5317Sjmmv  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11698d5317Sjmmv  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12698d5317Sjmmv  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13698d5317Sjmmv  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14698d5317Sjmmv  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15698d5317Sjmmv  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16698d5317Sjmmv  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17698d5317Sjmmv  */
18698d5317Sjmmv 
19698d5317Sjmmv #include <sys/types.h>
20698d5317Sjmmv 
21698d5317Sjmmv #include "tmux.h"
22698d5317Sjmmv 
23698d5317Sjmmv /*
245494e770Schristos  * Enter copy or clock mode.
25698d5317Sjmmv  */
26698d5317Sjmmv 
274e179ddaSchristos static enum cmd_retval	cmd_copy_mode_exec(struct cmd *, struct cmdq_item *);
28698d5317Sjmmv 
29698d5317Sjmmv const struct cmd_entry cmd_copy_mode_entry = {
30ed4e6cd4Schristos 	.name = "copy-mode",
31ed4e6cd4Schristos 	.alias = NULL,
32ed4e6cd4Schristos 
33*f8cf1a91Swiz 	.args = { "deHMs:t:uq", 0, 0, NULL },
34*f8cf1a91Swiz 	.usage = "[-deHMuq] [-s src-pane] " CMD_TARGET_PANE_USAGE,
35ed4e6cd4Schristos 
369fb66d81Schristos 	.source =  { 's', CMD_FIND_PANE, 0 },
37c9ad075bSchristos 	.target = { 't', CMD_FIND_PANE, 0 },
38ed4e6cd4Schristos 
394e179ddaSchristos 	.flags = CMD_AFTERHOOK,
40ed4e6cd4Schristos 	.exec = cmd_copy_mode_exec
41698d5317Sjmmv };
42698d5317Sjmmv 
435494e770Schristos const struct cmd_entry cmd_clock_mode_entry = {
44ed4e6cd4Schristos 	.name = "clock-mode",
45ed4e6cd4Schristos 	.alias = NULL,
46ed4e6cd4Schristos 
476db26757Swiz 	.args = { "t:", 0, 0, NULL },
48ed4e6cd4Schristos 	.usage = CMD_TARGET_PANE_USAGE,
49ed4e6cd4Schristos 
50c9ad075bSchristos 	.target = { 't', CMD_FIND_PANE, 0 },
51ed4e6cd4Schristos 
524e179ddaSchristos 	.flags = CMD_AFTERHOOK,
53ed4e6cd4Schristos 	.exec = cmd_copy_mode_exec
545494e770Schristos };
55698d5317Sjmmv 
564e179ddaSchristos static enum cmd_retval
574e179ddaSchristos cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item)
58698d5317Sjmmv {
599fb66d81Schristos 	struct args		*args = cmd_get_args(self);
609fb66d81Schristos 	struct key_event	*event = cmdq_get_event(item);
619fb66d81Schristos 	struct cmd_find_state	*source = cmdq_get_source(item);
629fb66d81Schristos 	struct cmd_find_state	*target = cmdq_get_target(item);
639fb66d81Schristos 	struct client		*c = cmdq_get_client(item);
645494e770Schristos 	struct session		*s;
659fb66d81Schristos 	struct window_pane	*wp = target->wp, *swp;
66698d5317Sjmmv 
67aa83ff61Schristos 	if (args_has(args, 'q')) {
68aa83ff61Schristos 		window_pane_reset_mode_all(wp);
69aa83ff61Schristos 		return (CMD_RETURN_NORMAL);
70aa83ff61Schristos 	}
71aa83ff61Schristos 
725494e770Schristos 	if (args_has(args, 'M')) {
739fb66d81Schristos 		if ((wp = cmd_mouse_pane(&event->m, &s, NULL)) == NULL)
745494e770Schristos 			return (CMD_RETURN_NORMAL);
755494e770Schristos 		if (c == NULL || c->session != s)
765494e770Schristos 			return (CMD_RETURN_NORMAL);
77ed4e6cd4Schristos 	}
78698d5317Sjmmv 
799fb66d81Schristos 	if (cmd_get_entry(self) == &cmd_clock_mode_entry) {
809fb66d81Schristos 		window_pane_set_mode(wp, NULL, &window_clock_mode, NULL, NULL);
815494e770Schristos 		return (CMD_RETURN_NORMAL);
825494e770Schristos 	}
835494e770Schristos 
849fb66d81Schristos 	if (args_has(args, 's'))
859fb66d81Schristos 		swp = source->wp;
869fb66d81Schristos 	else
879fb66d81Schristos 		swp = wp;
889fb66d81Schristos 	if (!window_pane_set_mode(wp, swp, &window_copy_mode, NULL, args)) {
89ef36e747Schristos 		if (args_has(args, 'M'))
909fb66d81Schristos 			window_copy_start_drag(c, &event->m);
916483eba0Schristos 	}
929fb66d81Schristos 	if (args_has(args, 'u'))
934e179ddaSchristos 		window_copy_pageup(wp, 0);
94*f8cf1a91Swiz 	if (args_has(args, 'd'))
95*f8cf1a91Swiz                 window_copy_pagedown(wp, 0, args_has(args, 'e'));
96698d5317Sjmmv 
97928fc495Schristos 	return (CMD_RETURN_NORMAL);
98698d5317Sjmmv }
99