Thomas Adam
2015-05-02 21:57:20 UTC
This adds support for indicating in the status line whether a given window
has been referenced more than once. In the case of grouped sessions this is
likely always going to be the case, but this also helps in showing which
windows in a session have been included via linkw, for example. Currently,
the window printable flag for this is '+'.
Also, add the corresponding #{window_references} flag for returning the
number of references on the window.
---
format.c | 2 ++
session.c | 15 +++++++++++++++
tmux.1 | 2 ++
tmux.h | 1 +
window.c | 2 ++
5 files changed, 22 insertions(+)
diff --git a/format.c b/format.c
index 9e9b6c8..a388a9a 100644
--- a/format.c
+++ b/format.c
@@ -589,6 +589,8 @@ format_defaults_window(struct format_tree *ft, struct window *w)
format_add(ft, "window_height", "%u", w->sy);
format_add(ft, "window_layout", "%s", layout);
format_add(ft, "window_panes", "%u", window_count_panes(w));
+ format_add(ft, "window_references", "%u",
+ session_count_window_refs(ft->s, ft->s->curw));
format_add(ft, "window_zoomed_flag", "%d",
!!(w->flags & WINDOW_ZOOMED));
diff --git a/session.c b/session.c
index 7d86f68..4076053 100644
--- a/session.c
+++ b/session.c
@@ -659,3 +659,18 @@ session_renumber_windows(struct session *s)
RB_FOREACH_SAFE(wl, winlinks, &old_wins, wl1)
winlink_remove(&old_wins, wl);
}
+
+/*
+ * Returns the number of refences on a window, which may be across a session
+ * group.
+ */
+u_int
+session_count_window_refs(struct session *s, struct winlink *wl)
+{
+ struct session_group *sg;
+
+ if ((sg = session_group_find(s)) != NULL)
+ return (session_group_count(sg));
+ else
+ return (wl->window->references);
+}
diff --git a/tmux.1 b/tmux.1
index b97fd8a..3e186d2 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3352,6 +3352,7 @@ The following variables are available, where appropriate:
.It Li "window_layout" Ta "" Ta "Window layout description"
.It Li "window_name" Ta "#W" Ta "Name of window"
.It Li "window_panes" Ta "" Ta "Number of panes in window"
+.It Li "window_references" Ta "" Ta "Number of references a window has"
.It Li "window_silence_flag" Ta "" Ta "1 if window has silence alert"
.It Li "window_width" Ta "" Ta "Width of window"
.It Li "window_zoomed_flag" Ta "" Ta "1 if window is zoomed"
@@ -3508,6 +3509,7 @@ The flag is one of the following symbols appended to the window name:
.It Li "!" Ta "A bell has occurred in the window."
.It Li "~" Ta "The window has been silent for the monitor-silence interval."
.It Li "Z" Ta "The window's active pane is zoomed."
+.It Li "+" Ta "The window has been linked from another session."
.El
.Pp
The # symbol relates to the
diff --git a/tmux.h b/tmux.h
index dddd4f8..012f7f8 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2340,6 +2340,7 @@ void session_group_synchronize_to(struct session *);
void session_group_synchronize_from(struct session *);
void session_group_synchronize1(struct session *, struct session *);
void session_renumber_windows(struct session *);
+u_int session_count_window_refs(struct session *, struct winlink *);
/* utf8.c */
void utf8_build(void);
diff --git a/window.c b/window.c
index 57e8ae4..57db62a 100644
--- a/window.c
+++ b/window.c
@@ -662,6 +662,8 @@ window_printable_flags(struct session *s, struct winlink *wl)
flags[pos++] = '-';
if (wl->window->flags & WINDOW_ZOOMED)
flags[pos++] = 'Z';
+ if (session_count_window_refs(s, wl) > 1)
+ flags[pos++] = '+';
if (pos == 0)
flags[pos++] = ' ';
flags[pos] = '\0';
has been referenced more than once. In the case of grouped sessions this is
likely always going to be the case, but this also helps in showing which
windows in a session have been included via linkw, for example. Currently,
the window printable flag for this is '+'.
Also, add the corresponding #{window_references} flag for returning the
number of references on the window.
---
format.c | 2 ++
session.c | 15 +++++++++++++++
tmux.1 | 2 ++
tmux.h | 1 +
window.c | 2 ++
5 files changed, 22 insertions(+)
diff --git a/format.c b/format.c
index 9e9b6c8..a388a9a 100644
--- a/format.c
+++ b/format.c
@@ -589,6 +589,8 @@ format_defaults_window(struct format_tree *ft, struct window *w)
format_add(ft, "window_height", "%u", w->sy);
format_add(ft, "window_layout", "%s", layout);
format_add(ft, "window_panes", "%u", window_count_panes(w));
+ format_add(ft, "window_references", "%u",
+ session_count_window_refs(ft->s, ft->s->curw));
format_add(ft, "window_zoomed_flag", "%d",
!!(w->flags & WINDOW_ZOOMED));
diff --git a/session.c b/session.c
index 7d86f68..4076053 100644
--- a/session.c
+++ b/session.c
@@ -659,3 +659,18 @@ session_renumber_windows(struct session *s)
RB_FOREACH_SAFE(wl, winlinks, &old_wins, wl1)
winlink_remove(&old_wins, wl);
}
+
+/*
+ * Returns the number of refences on a window, which may be across a session
+ * group.
+ */
+u_int
+session_count_window_refs(struct session *s, struct winlink *wl)
+{
+ struct session_group *sg;
+
+ if ((sg = session_group_find(s)) != NULL)
+ return (session_group_count(sg));
+ else
+ return (wl->window->references);
+}
diff --git a/tmux.1 b/tmux.1
index b97fd8a..3e186d2 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3352,6 +3352,7 @@ The following variables are available, where appropriate:
.It Li "window_layout" Ta "" Ta "Window layout description"
.It Li "window_name" Ta "#W" Ta "Name of window"
.It Li "window_panes" Ta "" Ta "Number of panes in window"
+.It Li "window_references" Ta "" Ta "Number of references a window has"
.It Li "window_silence_flag" Ta "" Ta "1 if window has silence alert"
.It Li "window_width" Ta "" Ta "Width of window"
.It Li "window_zoomed_flag" Ta "" Ta "1 if window is zoomed"
@@ -3508,6 +3509,7 @@ The flag is one of the following symbols appended to the window name:
.It Li "!" Ta "A bell has occurred in the window."
.It Li "~" Ta "The window has been silent for the monitor-silence interval."
.It Li "Z" Ta "The window's active pane is zoomed."
+.It Li "+" Ta "The window has been linked from another session."
.El
.Pp
The # symbol relates to the
diff --git a/tmux.h b/tmux.h
index dddd4f8..012f7f8 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2340,6 +2340,7 @@ void session_group_synchronize_to(struct session *);
void session_group_synchronize_from(struct session *);
void session_group_synchronize1(struct session *, struct session *);
void session_renumber_windows(struct session *);
+u_int session_count_window_refs(struct session *, struct winlink *);
/* utf8.c */
void utf8_build(void);
diff --git a/window.c b/window.c
index 57e8ae4..57db62a 100644
--- a/window.c
+++ b/window.c
@@ -662,6 +662,8 @@ window_printable_flags(struct session *s, struct winlink *wl)
flags[pos++] = '-';
if (wl->window->flags & WINDOW_ZOOMED)
flags[pos++] = 'Z';
+ if (session_count_window_refs(s, wl) > 1)
+ flags[pos++] = '+';
if (pos == 0)
flags[pos++] = ' ';
flags[pos] = '\0';
--
2.1.4
2.1.4