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