diff --git a/Makefile b/Makefile index a3872ee1..17097ea6 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,8 @@ SRCS= attributes.c buffer-poll.c buffer.c cfg.c client-fn.c \ cmd-kill-server.c cmd-kill-session.c cmd-kill-window.c \ cmd-last-window.c cmd-link-window.c cmd-list-buffers.c \ cmd-list-clients.c cmd-list-commands.c cmd-list-keys.c \ - cmd-list-sessions.c cmd-list-windows.c cmd-list.c cmd-load-buffer.c \ + cmd-list-sessions.c cmd-list-windows.c cmd-list-panes.c \ + cmd-list.c cmd-load-buffer.c \ cmd-lock-server.c cmd-lock-client.c cmd-lock-session.c \ cmd-move-window.c cmd-new-session.c cmd-new-window.c \ cmd-next-layout.c cmd-next-window.c cmd-paste-buffer.c \ diff --git a/cmd-list-panes.c b/cmd-list-panes.c new file mode 100644 index 00000000..0dcf0009 --- /dev/null +++ b/cmd-list-panes.c @@ -0,0 +1,78 @@ +/* $OpenBSD$ */ + +/* + * Copyright (c) 2009 Nicholas Marriott + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include + +#include "tmux.h" + +/* + * List panes on given window.. + */ + +int cmd_list_panes_exec(struct cmd *, struct cmd_ctx *); + +const struct cmd_entry cmd_list_panes_entry = { + "list-panes", "lsp", + CMD_TARGET_WINDOW_USAGE, + 0, 0, + cmd_target_init, + cmd_target_parse, + cmd_list_panes_exec, + cmd_target_free, + cmd_target_print +}; + +int +cmd_list_panes_exec(struct cmd *self, struct cmd_ctx *ctx) +{ + struct cmd_target_data *data = self->data; + struct winlink *wl; + struct window_pane *wp; + struct grid *gd; + struct grid_line *gl; + u_int i; + unsigned long long size; + const char *name; + + if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) + return (-1); + + TAILQ_FOREACH(wp, &wl->window->panes, entry) { + gd = wp->base.grid; + + size = 0; + for (i = 0; i < gd->hsize; i++) { + gl = &gd->linedata[i]; + size += gl->cellsize * sizeof *gl->celldata; + size += gl->utf8size * sizeof *gl->utf8data; + } + size += gd->hsize * sizeof *gd->linedata; + + name = NULL; + if (wp->fd != -1) + name = ttyname(wp->fd); + if (name == NULL) + name = "unknown"; + ctx->print(ctx, "%s [%ux%u] [history %u/%u, %llu bytes]", + name, wp->sx, wp->sy, gd->hsize, gd->hlimit, size); + } + + return (0); +} diff --git a/cmd-list-windows.c b/cmd-list-windows.c index c2f8bbd1..f8a46bcd 100644 --- a/cmd-list-windows.c +++ b/cmd-list-windows.c @@ -45,42 +45,13 @@ cmd_list_windows_exec(struct cmd *self, struct cmd_ctx *ctx) struct cmd_target_data *data = self->data; struct session *s; struct winlink *wl; - struct window *w; - struct window_pane *wp; - struct grid *gd; - struct grid_line *gl; - u_int i; - unsigned long long size; - const char *name; if ((s = cmd_find_session(ctx, data->target)) == NULL) return (-1); RB_FOREACH(wl, winlinks, &s->windows) { - w = wl->window; - ctx->print(ctx, - "%3d: %s [%ux%u]", wl->idx, w->name, w->sx, w->sy); - - TAILQ_FOREACH(wp, &w->panes, entry) { - gd = wp->base.grid; - - size = 0; - for (i = 0; i < gd->hsize; i++) { - gl = &gd->linedata[i]; - size += gl->cellsize * sizeof *gl->celldata; - size += gl->utf8size * sizeof *gl->utf8data; - } - size += gd->hsize * sizeof *gd->linedata; - - name = NULL; - if (wp->fd != -1) - name = ttyname(wp->fd); - if (name == NULL) - name = "unknown"; - ctx->print(ctx, - " %s [%ux%u] [history %u/%u, %llu bytes]", - name, wp->sx, wp->sy, gd->hsize, gd->hlimit, size); - } + ctx->print(ctx, "%d: %s [%ux%u]", + wl->idx, wl->window->name, wl->window->sx, wl->window->sy); } return (0); diff --git a/cmd.c b/cmd.c index 9ae1fa17..d453c726 100644 --- a/cmd.c +++ b/cmd.c @@ -58,6 +58,7 @@ const struct cmd_entry *cmd_table[] = { &cmd_list_clients_entry, &cmd_list_commands_entry, &cmd_list_keys_entry, + &cmd_list_panes_entry, &cmd_list_sessions_entry, &cmd_list_windows_entry, &cmd_load_buffer_entry, diff --git a/tmux.1 b/tmux.1 index 9e2365dd..ce662961 100644 --- a/tmux.1 +++ b/tmux.1 @@ -775,6 +775,10 @@ exists, it is killed, otherwise an error is generated. If .Fl d is given, the newly linked window is not selected. +.It Ic list-panes Op Fl t Ar target-window +.D1 (alias: Ic lsp ) +List the panes in the current window or in +.Ar target-window . .It Ic list-windows Op Fl t Ar target-session .D1 (alias: Ic lsw ) List windows in the current session or in diff --git a/tmux.h b/tmux.h index 2e2ee06a..c31039ad 100644 --- a/tmux.h +++ b/tmux.h @@ -1367,6 +1367,7 @@ extern const struct cmd_entry cmd_list_buffers_entry; extern const struct cmd_entry cmd_list_clients_entry; extern const struct cmd_entry cmd_list_commands_entry; extern const struct cmd_entry cmd_list_keys_entry; +extern const struct cmd_entry cmd_list_panes_entry; extern const struct cmd_entry cmd_list_sessions_entry; extern const struct cmd_entry cmd_list_windows_entry; extern const struct cmd_entry cmd_load_buffer_entry;