Home | History | Annotate | Line # | Download | only in dist
      1 /* $OpenBSD$ */
      2 
      3 /*
      4  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott (at) gmail.com>
      5  *
      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.
      9  *
     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.
     17  */
     18 
     19 #include <sys/types.h>
     20 
     21 #include <stdlib.h>
     22 #include <unistd.h>
     23 
     24 #include "tmux.h"
     25 
     26 /*
     27  * List windows on given session.
     28  */
     29 
     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			\
     37 	"#{session_name}:"					\
     38 	"#{window_index}: #{window_name}#{window_raw_flags} "	\
     39 	"(#{window_panes} panes) "				\
     40 	"[#{window_width}x#{window_height}] "
     41 
     42 static enum cmd_retval	cmd_list_windows_exec(struct cmd *, struct cmdq_item *);
     43 
     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);
     47 
     48 const struct cmd_entry cmd_list_windows_entry = {
     49 	.name = "list-windows",
     50 	.alias = "lsw",
     51 
     52 	.args = { "F:f:at:", 0, 0, NULL },
     53 	.usage = "[-a] [-F format] [-f filter] " CMD_TARGET_SESSION_USAGE,
     54 
     55 	.target = { 't', CMD_FIND_SESSION, 0 },
     56 
     57 	.flags = CMD_AFTERHOOK,
     58 	.exec = cmd_list_windows_exec
     59 };
     60 
     61 static enum cmd_retval
     62 cmd_list_windows_exec(struct cmd *self, struct cmdq_item *item)
     63 {
     64 	struct args		*args = cmd_get_args(self);
     65 	struct cmd_find_state	*target = cmdq_get_target(item);
     66 
     67 	if (args_has(args, 'a'))
     68 		cmd_list_windows_server(self, item);
     69 	else
     70 		cmd_list_windows_session(self, target->s, item, 0);
     71 
     72 	return (CMD_RETURN_NORMAL);
     73 }
     74 
     75 static void
     76 cmd_list_windows_server(struct cmd *self, struct cmdq_item *item)
     77 {
     78 	struct session	*s;
     79 
     80 	RB_FOREACH(s, sessions, &sessions)
     81 		cmd_list_windows_session(self, s, item, 1);
     82 }
     83 
     84 static void
     85 cmd_list_windows_session(struct cmd *self, struct session *s,
     86     struct cmdq_item *item, int type)
     87 {
     88 	struct args		*args = cmd_get_args(self);
     89 	struct winlink		*wl;
     90 	u_int			 n;
     91 	struct format_tree	*ft;
     92 	const char		*template, *filter;
     93 	char			*line, *expanded;
     94 	int			 flag;
     95 
     96 	template = args_get(args, 'F');
     97 	if (template == NULL) {
     98 		switch (type) {
     99 		case 0:
    100 			template = LIST_WINDOWS_TEMPLATE;
    101 			break;
    102 		case 1:
    103 			template = LIST_WINDOWS_WITH_SESSION_TEMPLATE;
    104 			break;
    105 		}
    106 	}
    107 	filter = args_get(args, 'f');
    108 
    109 	n = 0;
    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);
    114 
    115 		if (filter != NULL) {
    116 			expanded = format_expand(ft, filter);
    117 			flag = format_true(expanded);
    118 			free(expanded);
    119 		} else
    120 			flag = 1;
    121 		if (flag) {
    122 			line = format_expand(ft, template);
    123 			cmdq_print(item, "%s", line);
    124 			free(line);
    125 		}
    126 
    127 		format_free(ft);
    128 		n++;
    129 	}
    130 }
    131