xref: /netbsd-src/external/bsd/tmux/dist/cmd-list-panes.c (revision 6db267571823ee3b0a1d61478df085a087f2e990)
15494e770Schristos /* $OpenBSD$ */
2698d5317Sjmmv 
3698d5317Sjmmv /*
4ed4e6cd4Schristos  * Copyright (c) 2009 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 
21928fc495Schristos #include <stdlib.h>
22698d5317Sjmmv 
23698d5317Sjmmv #include "tmux.h"
24698d5317Sjmmv 
25698d5317Sjmmv /*
26698d5317Sjmmv  * List panes on given window.
27698d5317Sjmmv  */
28698d5317Sjmmv 
294e179ddaSchristos static enum cmd_retval	cmd_list_panes_exec(struct cmd *, struct cmdq_item *);
30698d5317Sjmmv 
314e179ddaSchristos static void	cmd_list_panes_server(struct cmd *, struct cmdq_item *);
324e179ddaSchristos static void	cmd_list_panes_session(struct cmd *, struct session *,
334e179ddaSchristos 		    struct cmdq_item *, int);
344e179ddaSchristos static void	cmd_list_panes_window(struct cmd *, struct session *,
354e179ddaSchristos 		    struct winlink *, struct cmdq_item *, int);
36d530c4d0Sjmmv 
37698d5317Sjmmv const struct cmd_entry cmd_list_panes_entry = {
38ed4e6cd4Schristos 	.name = "list-panes",
39ed4e6cd4Schristos 	.alias = "lsp",
40ed4e6cd4Schristos 
41*6db26757Swiz 	.args = { "asF:f:t:", 0, 0, NULL },
429fb66d81Schristos 	.usage = "[-as] [-F format] [-f filter] " CMD_TARGET_WINDOW_USAGE,
43ed4e6cd4Schristos 
44c9ad075bSchristos 	.target = { 't', CMD_FIND_WINDOW, 0 },
45ed4e6cd4Schristos 
464e179ddaSchristos 	.flags = CMD_AFTERHOOK,
47ed4e6cd4Schristos 	.exec = cmd_list_panes_exec
48698d5317Sjmmv };
49698d5317Sjmmv 
504e179ddaSchristos static enum cmd_retval
cmd_list_panes_exec(struct cmd * self,struct cmdq_item * item)514e179ddaSchristos cmd_list_panes_exec(struct cmd *self, struct cmdq_item *item)
52698d5317Sjmmv {
539fb66d81Schristos 	struct args		*args = cmd_get_args(self);
549fb66d81Schristos 	struct cmd_find_state	*target = cmdq_get_target(item);
559fb66d81Schristos 	struct session		*s = target->s;
569fb66d81Schristos 	struct winlink		*wl = target->wl;
57d530c4d0Sjmmv 
58d530c4d0Sjmmv 	if (args_has(args, 'a'))
594e179ddaSchristos 		cmd_list_panes_server(self, item);
60ed4e6cd4Schristos 	else if (args_has(args, 's'))
614e179ddaSchristos 		cmd_list_panes_session(self, s, item, 1);
62ed4e6cd4Schristos 	else
634e179ddaSchristos 		cmd_list_panes_window(self, s, wl, item, 0);
64d530c4d0Sjmmv 
65928fc495Schristos 	return (CMD_RETURN_NORMAL);
66d530c4d0Sjmmv }
67d530c4d0Sjmmv 
684e179ddaSchristos static void
cmd_list_panes_server(struct cmd * self,struct cmdq_item * item)694e179ddaSchristos cmd_list_panes_server(struct cmd *self, struct cmdq_item *item)
70d530c4d0Sjmmv {
71d530c4d0Sjmmv 	struct session	*s;
72d530c4d0Sjmmv 
73d530c4d0Sjmmv 	RB_FOREACH(s, sessions, &sessions)
744e179ddaSchristos 		cmd_list_panes_session(self, s, item, 2);
75d530c4d0Sjmmv }
76d530c4d0Sjmmv 
774e179ddaSchristos static void
cmd_list_panes_session(struct cmd * self,struct session * s,struct cmdq_item * item,int type)784e179ddaSchristos cmd_list_panes_session(struct cmd *self, struct session *s,
794e179ddaSchristos     struct cmdq_item *item, int type)
80d530c4d0Sjmmv {
81d530c4d0Sjmmv 	struct winlink	*wl;
82d530c4d0Sjmmv 
83d530c4d0Sjmmv 	RB_FOREACH(wl, winlinks, &s->windows)
844e179ddaSchristos 		cmd_list_panes_window(self, s, wl, item, type);
85d530c4d0Sjmmv }
86d530c4d0Sjmmv 
874e179ddaSchristos static void
cmd_list_panes_window(struct cmd * self,struct session * s,struct winlink * wl,struct cmdq_item * item,int type)885494e770Schristos cmd_list_panes_window(struct cmd *self, struct session *s, struct winlink *wl,
894e179ddaSchristos     struct cmdq_item *item, int type)
90d530c4d0Sjmmv {
919fb66d81Schristos 	struct args		*args = cmd_get_args(self);
92698d5317Sjmmv 	struct window_pane	*wp;
93928fc495Schristos 	u_int			 n;
94928fc495Schristos 	struct format_tree	*ft;
959fb66d81Schristos 	const char		*template, *filter;
969fb66d81Schristos 	char			*line, *expanded;
979fb66d81Schristos 	int			 flag;
98928fc495Schristos 
99928fc495Schristos 	template = args_get(args, 'F');
100928fc495Schristos 	if (template == NULL) {
101928fc495Schristos 		switch (type) {
102928fc495Schristos 		case 0:
103928fc495Schristos 			template = "#{pane_index}: "
104928fc495Schristos 			    "[#{pane_width}x#{pane_height}] [history "
105928fc495Schristos 			    "#{history_size}/#{history_limit}, "
106928fc495Schristos 			    "#{history_bytes} bytes] #{pane_id}"
107928fc495Schristos 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
108928fc495Schristos 			break;
109928fc495Schristos 		case 1:
110928fc495Schristos 			template = "#{window_index}.#{pane_index}: "
111928fc495Schristos 			    "[#{pane_width}x#{pane_height}] [history "
112928fc495Schristos 			    "#{history_size}/#{history_limit}, "
113928fc495Schristos 			    "#{history_bytes} bytes] #{pane_id}"
114928fc495Schristos 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
115928fc495Schristos 			break;
116928fc495Schristos 		case 2:
1175494e770Schristos 			template = "#{session_name}:#{window_index}."
1185494e770Schristos 			    "#{pane_index}: [#{pane_width}x#{pane_height}] "
1195494e770Schristos 			    "[history #{history_size}/#{history_limit}, "
120928fc495Schristos 			    "#{history_bytes} bytes] #{pane_id}"
121928fc495Schristos 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
122928fc495Schristos 			break;
123928fc495Schristos 		}
124928fc495Schristos 	}
1259fb66d81Schristos 	filter = args_get(args, 'f');
126698d5317Sjmmv 
127698d5317Sjmmv 	n = 0;
128698d5317Sjmmv 	TAILQ_FOREACH(wp, &wl->window->panes, entry) {
1299fb66d81Schristos 		ft = format_create(cmdq_get_client(item), item, FORMAT_NONE, 0);
130928fc495Schristos 		format_add(ft, "line", "%u", n);
1315494e770Schristos 		format_defaults(ft, NULL, s, wl, wp);
132698d5317Sjmmv 
1339fb66d81Schristos 		if (filter != NULL) {
1349fb66d81Schristos 			expanded = format_expand(ft, filter);
1359fb66d81Schristos 			flag = format_true(expanded);
1369fb66d81Schristos 			free(expanded);
1379fb66d81Schristos 		} else
1389fb66d81Schristos 			flag = 1;
1399fb66d81Schristos 		if (flag) {
140928fc495Schristos 			line = format_expand(ft, template);
1414e179ddaSchristos 			cmdq_print(item, "%s", line);
142928fc495Schristos 			free(line);
1439fb66d81Schristos 		}
144698d5317Sjmmv 
145928fc495Schristos 		format_free(ft);
146698d5317Sjmmv 		n++;
147698d5317Sjmmv 	}
148698d5317Sjmmv }
149