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