xref: /openbsd-src/usr.bin/tmux/cmd-list-panes.c (revision a51dead1c4d3ed85038c588391e643b117324e5a)
1*a51dead1Snicm /* $OpenBSD: cmd-list-panes.c,v 1.37 2021/08/21 10:22:39 nicm Exp $ */
258d0df6fSnicm 
358d0df6fSnicm /*
498ca8272Snicm  * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
558d0df6fSnicm  *
658d0df6fSnicm  * Permission to use, copy, modify, and distribute this software for any
758d0df6fSnicm  * purpose with or without fee is hereby granted, provided that the above
858d0df6fSnicm  * copyright notice and this permission notice appear in all copies.
958d0df6fSnicm  *
1058d0df6fSnicm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1158d0df6fSnicm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1258d0df6fSnicm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1358d0df6fSnicm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1458d0df6fSnicm  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
1558d0df6fSnicm  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
1658d0df6fSnicm  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1758d0df6fSnicm  */
1858d0df6fSnicm 
1958d0df6fSnicm #include <sys/types.h>
2058d0df6fSnicm 
217d053cf9Snicm #include <stdlib.h>
2258d0df6fSnicm 
2358d0df6fSnicm #include "tmux.h"
2458d0df6fSnicm 
2558d0df6fSnicm /*
26197ec97cSnicm  * List panes on given window.
2758d0df6fSnicm  */
2858d0df6fSnicm 
2968e0a7f2Snicm static enum cmd_retval	cmd_list_panes_exec(struct cmd *, struct cmdq_item *);
3058d0df6fSnicm 
3168e0a7f2Snicm static void	cmd_list_panes_server(struct cmd *, struct cmdq_item *);
32dc1f0f5fSnicm static void	cmd_list_panes_session(struct cmd *, struct session *,
3368e0a7f2Snicm 		    struct cmdq_item *, int);
34dc1f0f5fSnicm static void	cmd_list_panes_window(struct cmd *, struct session *,
3568e0a7f2Snicm 		    struct winlink *, struct cmdq_item *, int);
36c8b80c74Snicm 
3758d0df6fSnicm const struct cmd_entry cmd_list_panes_entry = {
38c057646bSnicm 	.name = "list-panes",
39c057646bSnicm 	.alias = "lsp",
40c057646bSnicm 
41*a51dead1Snicm 	.args = { "asF:f:t:", 0, 0, NULL },
42a805fcb5Snicm 	.usage = "[-as] [-F format] [-f filter] " CMD_TARGET_WINDOW_USAGE,
43c057646bSnicm 
44bf0d297eSnicm 	.target = { 't', CMD_FIND_WINDOW, 0 },
458d471e80Snicm 
467a61a8ddSnicm 	.flags = CMD_AFTERHOOK,
47c057646bSnicm 	.exec = cmd_list_panes_exec
4858d0df6fSnicm };
4958d0df6fSnicm 
50dc1f0f5fSnicm static enum cmd_retval
cmd_list_panes_exec(struct cmd * self,struct cmdq_item * item)5168e0a7f2Snicm cmd_list_panes_exec(struct cmd *self, struct cmdq_item *item)
5258d0df6fSnicm {
5390d7ba38Snicm 	struct args		*args = cmd_get_args(self);
54040343aeSnicm 	struct cmd_find_state	*target = cmdq_get_target(item);
55040343aeSnicm 	struct session		*s = target->s;
56040343aeSnicm 	struct winlink		*wl = target->wl;
57c8b80c74Snicm 
58c8b80c74Snicm 	if (args_has(args, 'a'))
5968e0a7f2Snicm 		cmd_list_panes_server(self, item);
603447b427Snicm 	else if (args_has(args, 's'))
6168e0a7f2Snicm 		cmd_list_panes_session(self, s, item, 1);
623447b427Snicm 	else
6368e0a7f2Snicm 		cmd_list_panes_window(self, s, wl, item, 0);
64c8b80c74Snicm 
65a224d0d3Snicm 	return (CMD_RETURN_NORMAL);
66c8b80c74Snicm }
67c8b80c74Snicm 
68dc1f0f5fSnicm static void
cmd_list_panes_server(struct cmd * self,struct cmdq_item * item)6968e0a7f2Snicm cmd_list_panes_server(struct cmd *self, struct cmdq_item *item)
70c8b80c74Snicm {
71c8b80c74Snicm 	struct session	*s;
72c8b80c74Snicm 
73c8b80c74Snicm 	RB_FOREACH(s, sessions, &sessions)
7468e0a7f2Snicm 		cmd_list_panes_session(self, s, item, 2);
75c8b80c74Snicm }
76c8b80c74Snicm 
77dc1f0f5fSnicm static void
cmd_list_panes_session(struct cmd * self,struct session * s,struct cmdq_item * item,int type)7868e0a7f2Snicm cmd_list_panes_session(struct cmd *self, struct session *s,
7968e0a7f2Snicm     struct cmdq_item *item, int type)
80c8b80c74Snicm {
81c8b80c74Snicm 	struct winlink	*wl;
82c8b80c74Snicm 
83c8b80c74Snicm 	RB_FOREACH(wl, winlinks, &s->windows)
8468e0a7f2Snicm 		cmd_list_panes_window(self, s, wl, item, type);
85c8b80c74Snicm }
86c8b80c74Snicm 
87dc1f0f5fSnicm static void
cmd_list_panes_window(struct cmd * self,struct session * s,struct winlink * wl,struct cmdq_item * item,int type)88a0824192Snicm cmd_list_panes_window(struct cmd *self, struct session *s, struct winlink *wl,
8968e0a7f2Snicm     struct cmdq_item *item, int type)
90c8b80c74Snicm {
9190d7ba38Snicm 	struct args		*args = cmd_get_args(self);
9258d0df6fSnicm 	struct window_pane	*wp;
93140a710dSnicm 	u_int			 n;
94140a710dSnicm 	struct format_tree	*ft;
95a805fcb5Snicm 	const char		*template, *filter;
96a805fcb5Snicm 	char			*line, *expanded;
97a805fcb5Snicm 	int			 flag;
98140a710dSnicm 
99140a710dSnicm 	template = args_get(args, 'F');
100140a710dSnicm 	if (template == NULL) {
101140a710dSnicm 		switch (type) {
102140a710dSnicm 		case 0:
1039ecbe243Snicm 			template = "#{pane_index}: "
104140a710dSnicm 			    "[#{pane_width}x#{pane_height}] [history "
105140a710dSnicm 			    "#{history_size}/#{history_limit}, "
106140a710dSnicm 			    "#{history_bytes} bytes] #{pane_id}"
107140a710dSnicm 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
108140a710dSnicm 			break;
109140a710dSnicm 		case 1:
1109ecbe243Snicm 			template = "#{window_index}.#{pane_index}: "
111140a710dSnicm 			    "[#{pane_width}x#{pane_height}] [history "
112140a710dSnicm 			    "#{history_size}/#{history_limit}, "
113140a710dSnicm 			    "#{history_bytes} bytes] #{pane_id}"
114140a710dSnicm 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
115140a710dSnicm 			break;
116140a710dSnicm 		case 2:
117a0824192Snicm 			template = "#{session_name}:#{window_index}."
118a0824192Snicm 			    "#{pane_index}: [#{pane_width}x#{pane_height}] "
119a0824192Snicm 			    "[history #{history_size}/#{history_limit}, "
120140a710dSnicm 			    "#{history_bytes} bytes] #{pane_id}"
121140a710dSnicm 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
122140a710dSnicm 			break;
123140a710dSnicm 		}
124140a710dSnicm 	}
125a805fcb5Snicm 	filter = args_get(args, 'f');
12658d0df6fSnicm 
12753355604Snicm 	n = 0;
12858d0df6fSnicm 	TAILQ_FOREACH(wp, &wl->window->panes, entry) {
129040343aeSnicm 		ft = format_create(cmdq_get_client(item), item, FORMAT_NONE, 0);
130140a710dSnicm 		format_add(ft, "line", "%u", n);
131f426771eSnicm 		format_defaults(ft, NULL, s, wl, wp);
13258d0df6fSnicm 
133a805fcb5Snicm 		if (filter != NULL) {
134a805fcb5Snicm 			expanded = format_expand(ft, filter);
135a805fcb5Snicm 			flag = format_true(expanded);
136a805fcb5Snicm 			free(expanded);
137a805fcb5Snicm 		} else
138a805fcb5Snicm 			flag = 1;
139a805fcb5Snicm 		if (flag) {
140140a710dSnicm 			line = format_expand(ft, template);
14168e0a7f2Snicm 			cmdq_print(item, "%s", line);
1427d053cf9Snicm 			free(line);
143a805fcb5Snicm 		}
14458d0df6fSnicm 
145140a710dSnicm 		format_free(ft);
14653355604Snicm 		n++;
14758d0df6fSnicm 	}
14858d0df6fSnicm }
149