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
29int	cmd_list_panes_exec(struct cmd *, struct cmd_ctx *);
30
31void	cmd_list_panes_server(struct cmd_ctx *);
32void	cmd_list_panes_session(struct session *, struct cmd_ctx *, int);
33void	cmd_list_panes_window(
34	    struct session *, struct winlink *, struct cmd_ctx *, int);
35
36const 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
46int
47cmd_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
70void
71cmd_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
79void
80cmd_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
88void
89cmd_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