Annotation of embedaddon/tmux/cmd-list-windows.c, revision 1.1
1.1 ! misho 1: /* $OpenBSD$ */
! 2:
! 3: /*
! 4: * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
! 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 windows on given session.
! 28: */
! 29:
! 30: #define LIST_WINDOWS_TEMPLATE \
! 31: "#{window_index}: #{window_name}#{window_flags} " \
! 32: "(#{window_panes} panes) " \
! 33: "[#{window_width}x#{window_height}] " \
! 34: "[layout #{window_layout}] #{window_id}" \
! 35: "#{?window_active, (active),}";
! 36: #define LIST_WINDOWS_WITH_SESSION_TEMPLATE \
! 37: "#{session_name}:" \
! 38: "#{window_index}: #{window_name}#{window_flags} " \
! 39: "(#{window_panes} panes) " \
! 40: "[#{window_width}x#{window_height}] "
! 41:
! 42: static enum cmd_retval cmd_list_windows_exec(struct cmd *, struct cmdq_item *);
! 43:
! 44: static void cmd_list_windows_server(struct cmd *, struct cmdq_item *);
! 45: static void cmd_list_windows_session(struct cmd *, struct session *,
! 46: struct cmdq_item *, int);
! 47:
! 48: const struct cmd_entry cmd_list_windows_entry = {
! 49: .name = "list-windows",
! 50: .alias = "lsw",
! 51:
! 52: .args = { "F:at:", 0, 0 },
! 53: .usage = "[-a] [-F format] " CMD_TARGET_SESSION_USAGE,
! 54:
! 55: .tflag = CMD_SESSION,
! 56:
! 57: .flags = CMD_AFTERHOOK,
! 58: .exec = cmd_list_windows_exec
! 59: };
! 60:
! 61: static enum cmd_retval
! 62: cmd_list_windows_exec(struct cmd *self, struct cmdq_item *item)
! 63: {
! 64: struct args *args = self->args;
! 65:
! 66: if (args_has(args, 'a'))
! 67: cmd_list_windows_server(self, item);
! 68: else
! 69: cmd_list_windows_session(self, item->state.tflag.s, item, 0);
! 70:
! 71: return (CMD_RETURN_NORMAL);
! 72: }
! 73:
! 74: static void
! 75: cmd_list_windows_server(struct cmd *self, struct cmdq_item *item)
! 76: {
! 77: struct session *s;
! 78:
! 79: RB_FOREACH(s, sessions, &sessions)
! 80: cmd_list_windows_session(self, s, item, 1);
! 81: }
! 82:
! 83: static void
! 84: cmd_list_windows_session(struct cmd *self, struct session *s,
! 85: struct cmdq_item *item, int type)
! 86: {
! 87: struct args *args = self->args;
! 88: struct winlink *wl;
! 89: u_int n;
! 90: struct format_tree *ft;
! 91: const char *template;
! 92: char *line;
! 93:
! 94: template = args_get(args, 'F');
! 95: if (template == NULL) {
! 96: switch (type) {
! 97: case 0:
! 98: template = LIST_WINDOWS_TEMPLATE;
! 99: break;
! 100: case 1:
! 101: template = LIST_WINDOWS_WITH_SESSION_TEMPLATE;
! 102: break;
! 103: }
! 104: }
! 105:
! 106: n = 0;
! 107: RB_FOREACH(wl, winlinks, &s->windows) {
! 108: ft = format_create(item, FORMAT_NONE, 0);
! 109: format_add(ft, "line", "%u", n);
! 110: format_defaults(ft, NULL, s, wl, NULL);
! 111:
! 112: line = format_expand(ft, template);
! 113: cmdq_print(item, "%s", line);
! 114: free(line);
! 115:
! 116: format_free(ft);
! 117: n++;
! 118: }
! 119: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>