Home | History | Annotate | Line # | Download | only in dist
cmd-list-panes.c revision 1.1.1.5
      1 /* $OpenBSD$ */
      2 
      3 /*
      4  * Copyright (c) 2009 Nicholas Marriott <nicm (at) users.sourceforge.net>
      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 
     23 #include "tmux.h"
     24 
     25 /*
     26  * List panes on given window.
     27  */
     28 
     29 enum cmd_retval	 cmd_list_panes_exec(struct cmd *, struct cmd_q *);
     30 
     31 void	cmd_list_panes_server(struct cmd *, struct cmd_q *);
     32 void	cmd_list_panes_session(struct cmd *, struct session *, struct cmd_q *,
     33 	    int);
     34 void	cmd_list_panes_window(struct cmd *, struct session *, struct winlink *,
     35 	    struct cmd_q *, int);
     36 
     37 const struct cmd_entry cmd_list_panes_entry = {
     38 	"list-panes", "lsp",
     39 	"asF:t:", 0, 0,
     40 	"[-as] [-F format] " CMD_TARGET_WINDOW_USAGE,
     41 	0,
     42 	cmd_list_panes_exec
     43 };
     44 
     45 enum cmd_retval
     46 cmd_list_panes_exec(struct cmd *self, struct cmd_q *cmdq)
     47 {
     48 	struct args	*args = self->args;
     49 	struct session	*s;
     50 	struct winlink	*wl;
     51 
     52 	if (args_has(args, 'a'))
     53 		cmd_list_panes_server(self, cmdq);
     54 	else if (args_has(args, 's')) {
     55 		s = cmd_find_session(cmdq, args_get(args, 't'), 0);
     56 		if (s == NULL)
     57 			return (CMD_RETURN_ERROR);
     58 		cmd_list_panes_session(self, s, cmdq, 1);
     59 	} else {
     60 		wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
     61 		if (wl == NULL)
     62 			return (CMD_RETURN_ERROR);
     63 		cmd_list_panes_window(self, s, wl, cmdq, 0);
     64 	}
     65 
     66 	return (CMD_RETURN_NORMAL);
     67 }
     68 
     69 void
     70 cmd_list_panes_server(struct cmd *self, struct cmd_q *cmdq)
     71 {
     72 	struct session	*s;
     73 
     74 	RB_FOREACH(s, sessions, &sessions)
     75 		cmd_list_panes_session(self, s, cmdq, 2);
     76 }
     77 
     78 void
     79 cmd_list_panes_session(struct cmd *self, struct session *s, struct cmd_q *cmdq,
     80     int type)
     81 {
     82 	struct winlink	*wl;
     83 
     84 	RB_FOREACH(wl, winlinks, &s->windows)
     85 		cmd_list_panes_window(self, s, wl, cmdq, type);
     86 }
     87 
     88 void
     89 cmd_list_panes_window(struct cmd *self, struct session *s, struct winlink *wl,
     90     struct cmd_q *cmdq, int type)
     91 {
     92 	struct args		*args = self->args;
     93 	struct window_pane	*wp;
     94 	u_int			 n;
     95 	struct format_tree	*ft;
     96 	const char		*template;
     97 	char			*line;
     98 
     99 	template = args_get(args, 'F');
    100 	if (template == NULL) {
    101 		switch (type) {
    102 		case 0:
    103 			template = "#{pane_index}: "
    104 			    "[#{pane_width}x#{pane_height}] [history "
    105 			    "#{history_size}/#{history_limit}, "
    106 			    "#{history_bytes} bytes] #{pane_id}"
    107 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
    108 			break;
    109 		case 1:
    110 			template = "#{window_index}.#{pane_index}: "
    111 			    "[#{pane_width}x#{pane_height}] [history "
    112 			    "#{history_size}/#{history_limit}, "
    113 			    "#{history_bytes} bytes] #{pane_id}"
    114 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
    115 			break;
    116 		case 2:
    117 			template = "#{session_name}:#{window_index}."
    118 			    "#{pane_index}: [#{pane_width}x#{pane_height}] "
    119 			    "[history #{history_size}/#{history_limit}, "
    120 			    "#{history_bytes} bytes] #{pane_id}"
    121 			    "#{?pane_active, (active),}#{?pane_dead, (dead),}";
    122 			break;
    123 		}
    124 	}
    125 
    126 	n = 0;
    127 	TAILQ_FOREACH(wp, &wl->window->panes, entry) {
    128 		ft = format_create();
    129 		format_add(ft, "line", "%u", n);
    130 		format_defaults(ft, NULL, s, wl, wp);
    131 
    132 		line = format_expand(ft, template);
    133 		cmdq_print(cmdq, "%s", line);
    134 		free(line);
    135 
    136 		format_free(ft);
    137 		n++;
    138 	}
    139 }
    140