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