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