xref: /minix3/external/bsd/tmux/dist/cmd-list-panes.c (revision b80da2a01d0bb632707b7b4e974aa32eaebbcc6f)
1 /* $Id: cmd-list-panes.c,v 1.1.1.2 2011/08/17 18:40:04 jmmv Exp $ */
2 
3 /*
4  * Copyright (c) 2009 Nicholas Marriott <nicm@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 <unistd.h>
22 
23 #include "tmux.h"
24 
25 /*
26  * List panes on given window.
27  */
28 
29 int	cmd_list_panes_exec(struct cmd *, struct cmd_ctx *);
30 
31 void	cmd_list_panes_server(struct cmd_ctx *);
32 void	cmd_list_panes_session(struct session *, struct cmd_ctx *, int);
33 void	cmd_list_panes_window(
34 	    struct session *, struct winlink *, struct cmd_ctx *, int);
35 
36 const struct cmd_entry cmd_list_panes_entry = {
37 	"list-panes", "lsp",
38 	"ast:", 0, 0,
39 	"[-as] [-t target]",
40 	0,
41 	NULL,
42 	NULL,
43 	cmd_list_panes_exec
44 };
45 
46 int
47 cmd_list_panes_exec(struct cmd *self, struct cmd_ctx *ctx)
48 {
49 	struct args	*args = self->args;
50 	struct session	*s;
51 	struct winlink	*wl;
52 
53 	if (args_has(args, 'a'))
54 		cmd_list_panes_server(ctx);
55 	else if (args_has(args, 's')) {
56 		s = cmd_find_session(ctx, args_get(args, 't'), 0);
57 		if (s == NULL)
58 			return (-1);
59 		cmd_list_panes_session(s, ctx, 1);
60 	} else {
61 		wl = cmd_find_window(ctx, args_get(args, 't'), &s);
62 		if (wl == NULL)
63 			return (-1);
64 		cmd_list_panes_window(s, wl, ctx, 0);
65 	}
66 
67 	return (0);
68 }
69 
70 void
71 cmd_list_panes_server(struct cmd_ctx *ctx)
72 {
73 	struct session	*s;
74 
75 	RB_FOREACH(s, sessions, &sessions)
76 		cmd_list_panes_session(s, ctx, 2);
77 }
78 
79 void
80 cmd_list_panes_session(struct session *s, struct cmd_ctx *ctx, int type)
81 {
82 	struct winlink	*wl;
83 
84 	RB_FOREACH(wl, winlinks, &s->windows)
85 		cmd_list_panes_window(s, wl, ctx, type);
86 }
87 
88 void
89 cmd_list_panes_window(
90     struct session *s, struct winlink *wl, struct cmd_ctx *ctx, int type)
91 {
92 	struct window_pane	*wp;
93 	struct grid		*gd;
94 	struct grid_line	*gl;
95 	u_int			 i, n;
96 	unsigned long long	 size;
97 
98 	n = 0;
99 	TAILQ_FOREACH(wp, &wl->window->panes, entry) {
100 		gd = wp->base.grid;
101 
102 		size = 0;
103 		for (i = 0; i < gd->hsize; i++) {
104 			gl = &gd->linedata[i];
105 			size += gl->cellsize * sizeof *gl->celldata;
106 			size += gl->utf8size * sizeof *gl->utf8data;
107 		}
108 		size += gd->hsize * sizeof *gd->linedata;
109 
110 		switch (type) {
111 		case 0:
112 			ctx->print(ctx,
113 			    "%u: [%ux%u] [history %u/%u, %llu bytes] %%%u%s%s",
114 			    n, wp->sx, wp->sy, gd->hsize, gd->hlimit, size,
115 			    wp->id, wp == wp->window->active ? " (active)" : "",
116 			    wp->fd == -1 ? " (dead)" : "");
117 			break;
118 		case 1:
119 			ctx->print(ctx,
120 			    "%d.%u: [%ux%u] [history %u/%u, %llu bytes] "
121 			    "%%%u%s%s", wl->idx,
122 			    n, wp->sx, wp->sy, gd->hsize, gd->hlimit, size,
123 			    wp->id, wp == wp->window->active ? " (active)" : "",
124 			    wp->fd == -1 ? " (dead)" : "");
125 			break;
126 		case 2:
127 			ctx->print(ctx,
128 			    "%s:%d.%u: [%ux%u] [history %u/%u, %llu bytes] "
129 			    "%%%u%s%s", s->name, wl->idx,
130 			    n, wp->sx, wp->sy, gd->hsize, gd->hlimit, size,
131 			    wp->id, wp == wp->window->active ? " (active)" : "",
132 			    wp->fd == -1 ? " (dead)" : "");
133 			break;
134 		}
135 		n++;
136 	}
137 }
138