4 * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
27 * List windows on given session.
30 #define LIST_WINDOWS_TEMPLATE \
31 "#{window_index}: #{window_name}#{window_raw_flags} " \
32 "(#{window_panes} panes) " \
33 "[#{window_width}x#{window_height}] " \
34 "[layout #{window_layout}] #{window_id}" \
35 "#{?window_active, (active),}";
36 #define LIST_WINDOWS_WITH_SESSION_TEMPLATE \
38 "#{window_index}: #{window_name}#{window_raw_flags} " \
39 "(#{window_panes} panes) " \
40 "[#{window_width}x#{window_height}] "
42 static enum cmd_retval
cmd_list_windows_exec(struct cmd
*, struct cmdq_item
*);
44 static void cmd_list_windows_server(struct cmd
*, struct cmdq_item
*);
45 static void cmd_list_windows_session(struct cmd
*, struct session
*,
46 struct cmdq_item
*, int);
48 const struct cmd_entry cmd_list_windows_entry
= {
49 .name
= "list-windows",
52 .args
= { "F:f:at:", 0, 0, NULL
},
53 .usage
= "[-a] [-F format] [-f filter] " CMD_TARGET_SESSION_USAGE
,
55 .target
= { 't', CMD_FIND_SESSION
, 0 },
57 .flags
= CMD_AFTERHOOK
,
58 .exec
= cmd_list_windows_exec
61 static enum cmd_retval
62 cmd_list_windows_exec(struct cmd
*self
, struct cmdq_item
*item
)
64 struct args
*args
= cmd_get_args(self
);
65 struct cmd_find_state
*target
= cmdq_get_target(item
);
67 if (args_has(args
, 'a'))
68 cmd_list_windows_server(self
, item
);
70 cmd_list_windows_session(self
, target
->s
, item
, 0);
72 return (CMD_RETURN_NORMAL
);
76 cmd_list_windows_server(struct cmd
*self
, struct cmdq_item
*item
)
80 RB_FOREACH(s
, sessions
, &sessions
)
81 cmd_list_windows_session(self
, s
, item
, 1);
85 cmd_list_windows_session(struct cmd
*self
, struct session
*s
,
86 struct cmdq_item
*item
, int type
)
88 struct args
*args
= cmd_get_args(self
);
91 struct format_tree
*ft
;
92 const char *template, *filter
;
93 char *line
, *expanded
;
96 template = args_get(args
, 'F');
97 if (template == NULL
) {
100 template = LIST_WINDOWS_TEMPLATE
;
103 template = LIST_WINDOWS_WITH_SESSION_TEMPLATE
;
107 filter
= args_get(args
, 'f');
110 RB_FOREACH(wl
, winlinks
, &s
->windows
) {
111 ft
= format_create(cmdq_get_client(item
), item
, FORMAT_NONE
, 0);
112 format_add(ft
, "line", "%u", n
);
113 format_defaults(ft
, NULL
, s
, wl
, NULL
);
115 if (filter
!= NULL
) {
116 expanded
= format_expand(ft
, filter
);
117 flag
= format_true(expanded
);
122 line
= format_expand(ft
, template);
123 cmdq_print(item
, "%s", line
);