xref: /openbsd-src/usr.bin/tmux/cmd-choose-tree.c (revision af11b61d5d7d6672d789056da9e8e9b2862a20b6)
1*af11b61dSnicm /* $OpenBSD: cmd-choose-tree.c,v 1.52 2024/10/04 19:16:13 nicm Exp $ */
2e001d847Snicm 
3e001d847Snicm /*
4e001d847Snicm  * Copyright (c) 2012 Thomas Adam <thomas@xteddy.org>
5e001d847Snicm  *
6e001d847Snicm  * Permission to use, copy, modify, and distribute this software for any
7e001d847Snicm  * purpose with or without fee is hereby granted, provided that the above
8e001d847Snicm  * copyright notice and this permission notice appear in all copies.
9e001d847Snicm  *
10e001d847Snicm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11e001d847Snicm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12e001d847Snicm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13e001d847Snicm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14e001d847Snicm  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15e001d847Snicm  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16e001d847Snicm  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17e001d847Snicm  */
18e001d847Snicm 
19e001d847Snicm #include <sys/types.h>
20e001d847Snicm 
21e001d847Snicm #include "tmux.h"
22e001d847Snicm 
23e001d847Snicm /*
24a42faf7dSnicm  * Enter a mode.
25e001d847Snicm  */
26e001d847Snicm 
27d8b32369Snicm static enum args_parse_type	cmd_choose_tree_args_parse(struct args *args,
28d8b32369Snicm 				    u_int idx, char **cause);
29d8b32369Snicm static enum cmd_retval		cmd_choose_tree_exec(struct cmd *,
30d8b32369Snicm     				    struct cmdq_item *);
31e001d847Snicm 
32e001d847Snicm const struct cmd_entry cmd_choose_tree_entry = {
33c057646bSnicm 	.name = "choose-tree",
34c057646bSnicm 	.alias = NULL,
35c057646bSnicm 
36*af11b61dSnicm 	.args = { "F:f:GK:NO:rst:wyZ", 0, 1, cmd_choose_tree_args_parse },
37438eed14Snicm 	.usage = "[-GNrswZ] [-F format] [-f filter] [-K key-format] "
38438eed14Snicm 		 "[-O sort-order] " CMD_TARGET_PANE_USAGE " [template]",
39c057646bSnicm 
40a42faf7dSnicm 	.target = { 't', CMD_FIND_PANE, 0 },
418d471e80Snicm 
428d471e80Snicm 	.flags = 0,
43c057646bSnicm 	.exec = cmd_choose_tree_exec
44e001d847Snicm };
45e001d847Snicm 
46a42faf7dSnicm const struct cmd_entry cmd_choose_client_entry = {
47a42faf7dSnicm 	.name = "choose-client",
48c057646bSnicm 	.alias = NULL,
49c057646bSnicm 
50*af11b61dSnicm 	.args = { "F:f:K:NO:rt:yZ", 0, 1, cmd_choose_tree_args_parse },
51438eed14Snicm 	.usage = "[-NrZ] [-F format] [-f filter] [-K key-format] "
52438eed14Snicm 		 "[-O sort-order] " CMD_TARGET_PANE_USAGE " [template]",
53c057646bSnicm 
54a42faf7dSnicm 	.target = { 't', CMD_FIND_PANE, 0 },
558d471e80Snicm 
568d471e80Snicm 	.flags = 0,
57c057646bSnicm 	.exec = cmd_choose_tree_exec
58e001d847Snicm };
59e001d847Snicm 
60a42faf7dSnicm const struct cmd_entry cmd_choose_buffer_entry = {
61a42faf7dSnicm 	.name = "choose-buffer",
62c057646bSnicm 	.alias = NULL,
63c057646bSnicm 
64*af11b61dSnicm 	.args = { "F:f:K:NO:rt:yZ", 0, 1, cmd_choose_tree_args_parse },
65438eed14Snicm 	.usage = "[-NrZ] [-F format] [-f filter] [-K key-format] "
66438eed14Snicm 		 "[-O sort-order] " CMD_TARGET_PANE_USAGE " [template]",
67c057646bSnicm 
68a42faf7dSnicm 	.target = { 't', CMD_FIND_PANE, 0 },
698d471e80Snicm 
708d471e80Snicm 	.flags = 0,
71c057646bSnicm 	.exec = cmd_choose_tree_exec
72e001d847Snicm };
73e001d847Snicm 
7467c16a7cSnicm const struct cmd_entry cmd_customize_mode_entry = {
7567c16a7cSnicm 	.name = "customize-mode",
7667c16a7cSnicm 	.alias = NULL,
7767c16a7cSnicm 
78*af11b61dSnicm 	.args = { "F:f:Nt:yZ", 0, 0, NULL },
7967c16a7cSnicm 	.usage = "[-NZ] [-F format] [-f filter] " CMD_TARGET_PANE_USAGE,
8067c16a7cSnicm 
8167c16a7cSnicm 	.target = { 't', CMD_FIND_PANE, 0 },
8267c16a7cSnicm 
8367c16a7cSnicm 	.flags = 0,
8467c16a7cSnicm 	.exec = cmd_choose_tree_exec
8567c16a7cSnicm };
8667c16a7cSnicm 
87d8b32369Snicm static enum args_parse_type
88d8b32369Snicm cmd_choose_tree_args_parse(__unused struct args *args, __unused u_int idx,
89d8b32369Snicm     __unused char **cause)
90d8b32369Snicm {
91d8b32369Snicm 	return (ARGS_PARSE_COMMANDS_OR_STRING);
92d8b32369Snicm }
93d8b32369Snicm 
94dc1f0f5fSnicm static enum cmd_retval
9568e0a7f2Snicm cmd_choose_tree_exec(struct cmd *self, struct cmdq_item *item)
96e001d847Snicm {
9790d7ba38Snicm 	struct args			*args = cmd_get_args(self);
98040343aeSnicm 	struct cmd_find_state		*target = cmdq_get_target(item);
99040343aeSnicm 	struct window_pane		*wp = target->wp;
100a42faf7dSnicm 	const struct window_mode	*mode;
101e001d847Snicm 
10290d7ba38Snicm 	if (cmd_get_entry(self) == &cmd_choose_buffer_entry) {
103e5d942bbSnicm 		if (paste_is_empty())
104a224d0d3Snicm 			return (CMD_RETURN_NORMAL);
105a42faf7dSnicm 		mode = &window_buffer_mode;
10690d7ba38Snicm 	} else if (cmd_get_entry(self) == &cmd_choose_client_entry) {
107a42faf7dSnicm 		if (server_client_how_many() == 0)
108a42faf7dSnicm 			return (CMD_RETURN_NORMAL);
109a42faf7dSnicm 		mode = &window_client_mode;
11067c16a7cSnicm 	} else if (cmd_get_entry(self) == &cmd_customize_mode_entry)
11167c16a7cSnicm 		mode = &window_customize_mode;
11267c16a7cSnicm 	else
113a42faf7dSnicm 		mode = &window_tree_mode;
114e001d847Snicm 
115040343aeSnicm 	window_pane_set_mode(wp, NULL, mode, target, args);
116a224d0d3Snicm 	return (CMD_RETURN_NORMAL);
117e001d847Snicm }
118