summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/format.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2019-12-26 11:04:59 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2019-12-26 11:04:59 +0000
commit18b030bd7616d1ef9ed356266d6d6d8ea86a003f (patch)
treea5ce8bfab419035e480e3d7c4631d7bf69123639 /usr.bin/tmux/format.c
parent96ef905ed6dfa104a22e1bf8226778dbbc5be959 (diff)
Add a number of new formats to inspect what sessions and clients a
window is present or active in. From Tyler Culp in GitHub issue 2034.
Diffstat (limited to 'usr.bin/tmux/format.c')
-rw-r--r--usr.bin/tmux/format.c215
1 files changed, 214 insertions, 1 deletions
diff --git a/usr.bin/tmux/format.c b/usr.bin/tmux/format.c
index ff05389d269..1c8b5367e2c 100644
--- a/usr.bin/tmux/format.c
+++ b/usr.bin/tmux/format.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: format.c,v 1.220 2019/11/28 21:18:38 nicm Exp $ */
+/* $OpenBSD: format.c,v 1.221 2019/12/26 11:04:58 nicm Exp $ */
/*
* Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -456,6 +456,35 @@ format_cb_pid(__unused struct format_tree *ft, struct format_entry *fe)
xasprintf(&fe->value, "%ld", (long)getpid());
}
+/* Callback for session_attached_list. */
+static void
+format_cb_session_attached_list(struct format_tree *ft, struct format_entry *fe)
+{
+ struct session *s = ft->s;
+ struct client *loop;
+ struct evbuffer *buffer;
+ int size;
+
+ if (s == NULL)
+ return;
+
+ buffer = evbuffer_new();
+ if (buffer == NULL)
+ fatalx("out of memory");
+
+ TAILQ_FOREACH(loop, &clients, entry) {
+ if (loop->session == s) {
+ if (EVBUFFER_LENGTH(buffer) > 0)
+ evbuffer_add(buffer, ",", 1);
+ evbuffer_add_printf(buffer, "%s", loop->name);
+ }
+ }
+
+ if ((size = EVBUFFER_LENGTH(buffer)) != 0)
+ xasprintf(&fe->value, "%.*s", size, EVBUFFER_DATA(buffer));
+ evbuffer_free(buffer);
+}
+
/* Callback for session_alerts. */
static void
format_cb_session_alerts(struct format_tree *ft, struct format_entry *fe)
@@ -528,6 +557,128 @@ format_cb_window_stack_index(struct format_tree *ft, struct format_entry *fe)
fe->value = xstrdup("0");
}
+/* Callback for window_linked_sessions_list. */
+static void
+format_cb_window_linked_sessions_list(struct format_tree *ft,
+ struct format_entry *fe)
+{
+ struct window *w = ft->wl->window;
+ struct winlink *wl;
+ struct evbuffer *buffer;
+ int size;
+
+ buffer = evbuffer_new();
+ if (buffer == NULL)
+ fatalx("out of memory");
+
+ TAILQ_FOREACH(wl, &w->winlinks, wentry) {
+ if (EVBUFFER_LENGTH(buffer) > 0)
+ evbuffer_add(buffer, ",", 1);
+ evbuffer_add_printf(buffer, "%s", wl->session->name);
+ }
+
+ if ((size = EVBUFFER_LENGTH(buffer)) != 0)
+ xasprintf(&fe->value, "%.*s", size, EVBUFFER_DATA(buffer));
+ evbuffer_free(buffer);
+}
+
+/* Callback for window_active_sessions. */
+static void
+format_cb_window_active_sessions(struct format_tree *ft,
+ struct format_entry *fe)
+{
+ struct window *w = ft->wl->window;
+ struct winlink *wl;
+ u_int n = 0;
+
+ TAILQ_FOREACH(wl, &w->winlinks, wentry) {
+ if (wl->session->curw == wl)
+ n++;
+ }
+
+ xasprintf(&fe->value, "%u", n);
+}
+
+/* Callback for window_active_sessions_list. */
+static void
+format_cb_window_active_sessions_list(struct format_tree *ft,
+ struct format_entry *fe)
+{
+ struct window *w = ft->wl->window;
+ struct winlink *wl;
+ struct evbuffer *buffer;
+ int size;
+
+ buffer = evbuffer_new();
+ if (buffer == NULL)
+ fatalx("out of memory");
+
+ TAILQ_FOREACH(wl, &w->winlinks, wentry) {
+ if (wl->session->curw == wl) {
+ if (EVBUFFER_LENGTH(buffer) > 0)
+ evbuffer_add(buffer, ",", 1);
+ evbuffer_add_printf(buffer, "%s", wl->session->name);
+ }
+ }
+
+ if ((size = EVBUFFER_LENGTH(buffer)) != 0)
+ xasprintf(&fe->value, "%.*s", size, EVBUFFER_DATA(buffer));
+ evbuffer_free(buffer);
+}
+
+/* Callback for window_active_clients. */
+static void
+format_cb_window_active_clients(struct format_tree *ft, struct format_entry *fe)
+{
+ struct window *w = ft->wl->window;
+ struct client *loop;
+ struct session *client_session;
+ u_int n = 0;
+
+ TAILQ_FOREACH(loop, &clients, entry) {
+ client_session = loop->session;
+ if (client_session == NULL)
+ continue;
+
+ if (w == client_session->curw->window)
+ n++;
+ }
+
+ xasprintf(&fe->value, "%u", n);
+}
+
+/* Callback for window_active_clients_list. */
+static void
+format_cb_window_active_clients_list(struct format_tree *ft,
+ struct format_entry *fe)
+{
+ struct window *w = ft->wl->window;
+ struct client *loop;
+ struct session *client_session;
+ struct evbuffer *buffer;
+ int size;
+
+ buffer = evbuffer_new();
+ if (buffer == NULL)
+ fatalx("out of memory");
+
+ TAILQ_FOREACH(loop, &clients, entry) {
+ client_session = loop->session;
+ if (client_session == NULL)
+ continue;
+
+ if (w == client_session->curw->window) {
+ if (EVBUFFER_LENGTH(buffer) > 0)
+ evbuffer_add(buffer, ",", 1);
+ evbuffer_add_printf(buffer, "%s", loop->name);
+ }
+ }
+
+ if ((size = EVBUFFER_LENGTH(buffer)) != 0)
+ xasprintf(&fe->value, "%.*s", size, EVBUFFER_DATA(buffer));
+ evbuffer_free(buffer);
+}
+
/* Callback for window_layout. */
static void
format_cb_window_layout(struct format_tree *ft, struct format_entry *fe)
@@ -662,11 +813,52 @@ format_cb_session_group_list(struct format_tree *ft, struct format_entry *fe)
buffer = evbuffer_new();
if (buffer == NULL)
fatalx("out of memory");
+
TAILQ_FOREACH(loop, &sg->sessions, gentry) {
if (EVBUFFER_LENGTH(buffer) > 0)
evbuffer_add(buffer, ",", 1);
evbuffer_add_printf(buffer, "%s", loop->name);
}
+
+ if ((size = EVBUFFER_LENGTH(buffer)) != 0)
+ xasprintf(&fe->value, "%.*s", size, EVBUFFER_DATA(buffer));
+ evbuffer_free(buffer);
+}
+
+/* Callback for session_group_attached_list. */
+static void
+format_cb_session_group_attached_list(struct format_tree *ft,
+ struct format_entry *fe)
+{
+ struct session *s = ft->s, *client_session, *session_loop;
+ struct session_group *sg;
+ struct client *loop;
+ struct evbuffer *buffer;
+ int size;
+
+ if (s == NULL)
+ return;
+ sg = session_group_contains(s);
+ if (sg == NULL)
+ return;
+
+ buffer = evbuffer_new();
+ if (buffer == NULL)
+ fatalx("out of memory");
+
+ TAILQ_FOREACH(loop, &clients, entry) {
+ client_session = loop->session;
+ if (client_session == NULL)
+ continue;
+ TAILQ_FOREACH(session_loop, &sg->sessions, gentry) {
+ if (session_loop == client_session){
+ if (EVBUFFER_LENGTH(buffer) > 0)
+ evbuffer_add(buffer, ",", 1);
+ evbuffer_add_printf(buffer, "%s", loop->name);
+ }
+ }
+ }
+
if ((size = EVBUFFER_LENGTH(buffer)) != 0)
xasprintf(&fe->value, "%.*s", size, EVBUFFER_DATA(buffer));
evbuffer_free(buffer);
@@ -2125,8 +2317,14 @@ format_defaults_session(struct format_tree *ft, struct session *s)
format_add(ft, "session_group", "%s", sg->name);
format_add(ft, "session_group_size", "%u",
session_group_count (sg));
+ format_add(ft, "session_group_attached", "%u",
+ session_group_attached_count (sg));
+ format_add(ft, "session_group_many_attached", "%u",
+ session_group_attached_count (sg) > 1);
format_add_cb(ft, "session_group_list",
format_cb_session_group_list);
+ format_add_cb(ft, "session_group_attached_list",
+ format_cb_session_group_attached_list);
}
format_add_tv(ft, "session_created", &s->creation_time);
@@ -2135,6 +2333,8 @@ format_defaults_session(struct format_tree *ft, struct session *s)
format_add(ft, "session_attached", "%u", s->attached);
format_add(ft, "session_many_attached", "%d", s->attached > 1);
+ format_add_cb(ft, "session_attached_list",
+ format_cb_session_attached_list);
format_add_cb(ft, "session_alerts", format_cb_session_alerts);
format_add_cb(ft, "session_stack", format_cb_session_stack);
@@ -2249,6 +2449,14 @@ format_defaults_winlink(struct format_tree *ft, struct winlink *wl)
format_add_cb(ft, "window_stack_index", format_cb_window_stack_index);
format_add(ft, "window_flags", "%s", window_printable_flags(wl));
format_add(ft, "window_active", "%d", wl == s->curw);
+ format_add_cb(ft, "window_active_sessions",
+ format_cb_window_active_sessions);
+ format_add_cb(ft, "window_active_sessions_list",
+ format_cb_window_active_sessions_list);
+ format_add_cb(ft, "window_active_clients",
+ format_cb_window_active_clients);
+ format_add_cb(ft, "window_active_clients_list",
+ format_cb_window_active_clients_list);
format_add(ft, "window_start_flag", "%d",
!!(wl == RB_MIN(winlinks, &s->windows)));
@@ -2269,6 +2477,11 @@ format_defaults_winlink(struct format_tree *ft, struct winlink *wl)
format_add(ft, "window_last_flag", "%d",
!!(wl == TAILQ_FIRST(&s->lastw)));
format_add(ft, "window_linked", "%d", session_is_linked(s, wl->window));
+
+ format_add_cb(ft, "window_linked_sessions_list",
+ format_cb_window_linked_sessions_list);
+ format_add(ft, "window_linked_sessions", "%u",
+ wl->window->references);
}
/* Set default format keys for a window pane. */