Index: cmd-kill-window.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/cmd-kill-window.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -p -r1.16 -r1.17
--- cmd-kill-window.c 22 Oct 2014 23:11:41 -0000 1.16
+++ cmd-kill-window.c 6 May 2015 08:35:39 -0000 1.17
@@ -45,24 +45,17 @@ const struct cmd_entry cmd_unlink_window
enum cmd_retval
cmd_kill_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
- struct args *args = self->args;
- struct winlink *wl, *wl2, *wl3;
- struct window *w;
- struct session *s;
- struct session_group *sg;
- u_int references;
+ struct args *args = self->args;
+ struct winlink *wl, *wl2, *wl3;
+ struct window *w;
+ struct session *s;
if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
return (CMD_RETURN_ERROR);
w = wl->window;
if (self->entry == &cmd_unlink_window_entry) {
- sg = session_group_find(s);
- if (sg != NULL)
- references = session_group_count(sg);
- else
- references = 1;
- if (!args_has(self->args, 'k') && w->references == references) {
+ if (!args_has(self->args, 'k') && !session_is_linked(s, w)) {
cmdq_error(cmdq, "window only linked to one session");
return (CMD_RETURN_ERROR);
}
Index: format.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/format.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -p -r1.63 -r1.64
--- format.c 21 Apr 2015 22:38:49 -0000 1.63
+++ format.c 6 May 2015 08:35:39 -0000 1.64
@@ -621,6 +621,7 @@ format_defaults_winlink(struct format_tr
!!(wl->flags & WINLINK_SILENCE));
format_add(ft, "window_last_flag", "%d",
!!(wl == TAILQ_FIRST(&s->lastw)));
+ format_add(ft, "window_linked", "%d", session_is_linked(s, wl->window));
free(flags);
}
Index: options-table.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/options-table.c,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -p -r1.56 -r1.57
--- options-table.c 29 Apr 2015 15:59:08 -0000 1.56
+++ options-table.c 6 May 2015 08:35:39 -0000 1.57
@@ -737,7 +737,7 @@ const struct options_table_entry window_
{ .name = "window-status-current-format",
.type = OPTIONS_TABLE_STRING,
- .default_str = "#I:#W#F"
+ .default_str = "#I:#W#{?window_flags,#{window_flags}, }"
},
{ .name = "window-status-current-style",
@@ -753,7 +753,7 @@ const struct options_table_entry window_
{ .name = "window-status-format",
.type = OPTIONS_TABLE_STRING,
- .default_str = "#I:#W#F"
+ .default_str = "#I:#W#{?window_flags,#{window_flags}, }"
},
{ .name = "window-status-last-attr",
Index: session.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/session.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -p -r1.48 -r1.49
--- session.c 25 Apr 2015 18:09:28 -0000 1.48
+++ session.c 6 May 2015 08:35:39 -0000 1.49
@@ -335,6 +335,20 @@ session_has(struct session *s, struct wi
return (1);
}
return (0);
+}
+
+/*
+ * Return 1 if a window is linked outside this session (not including session
+ * groups). The window must be in this session!
+ */
+int
+session_is_linked(struct session *s, struct window *w)
+{
+ struct session_group *sg;
+
+ if ((sg = session_group_find(s)) != NULL)
+ return (w->references != session_group_count(sg));
+ return (w->references != 1);
}
struct winlink *
Index: tmux.h
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tmux.h,v
retrieving revision 1.503
retrieving revision 1.504
diff -u -p -r1.503 -r1.504
--- tmux.h 28 Apr 2015 10:43:14 -0000 1.503
+++ tmux.h 6 May 2015 08:35:39 -0000 1.504
@@ -2328,6 +2328,7 @@ struct winlink *session_attach(struct se
char **);
int session_detach(struct session *, struct winlink *);
int session_has(struct session *, struct window *);
+int session_is_linked(struct session *, struct window *);
int session_next(struct session *, int);
int session_previous(struct session *, int);
int session_select(struct session *, int);
Index: window.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/window.c,v
retrieving revision 1.127
retrieving revision 1.128
diff -u -p -r1.127 -r1.128
--- window.c 28 Apr 2015 10:43:14 -0000 1.127
+++ window.c 6 May 2015 08:35:39 -0000 1.128
@@ -643,7 +643,7 @@ window_destroy_panes(struct window *w)
}
}
-/* Return list of printable window flag symbols. No flags is just a space. */
+/* Retuns the printable flags on a window, empty string if no flags set. */
char *
window_printable_flags(struct session *s, struct winlink *wl)
{
@@ -663,8 +663,6 @@ window_printable_flags(struct session *s
flags[pos++] = '-';
if (wl->window->flags & WINDOW_ZOOMED)
flags[pos++] = 'Z';
- if (pos == 0)
- flags[pos++] = ' ';
flags[pos] = '\0';
return (xstrdup(flags));
}
On Mon, May 04, 2015 at 11:40:31PM +0100, Thomas Adam wrote:
> On Sun, May 03, 2015 at 09:08:51AM +0100, Nicholas Marriott wrote:
> > Hi
> >
> > format_defaults_window can't rely on ft->s being set. Perhaps you want
> > to put it in format_defaults_winlink, although check if that always has
> > the session.
> >
> > I don't think it's good that every window in a grouped session should
> > suddenly grow a +.
>
> Here's an updated version:
>
> * Now just uses #{?window_flags,#{window_flags},} to check if there are
> any flags; removing the previous #{has_window_flags} format.
>
> * The hard-coded space in window_printable_flags() has been removed,
> allowing expansion of that through formats instead.
>
> -- Thomas Adam
>
> --
> "Deep in my heart I wish I was wrong. But deep in my heart I know I am
> not." -- Morrissey ("Girl Least Likely To" -- off of Viva Hate.)
> From 6fd7702571fcc64b26d184a9b790e4f3fafdf952 Mon Sep 17 00:00:00 2001
> From: Thomas Adam <[email protected]>
> Date: Sat, 2 May 2015 22:51:36 +0100
> Subject: [PATCH] Window flags: window_linked
>
> This primarily adds support for a new flag, 'window_linked' to indicate
> whether the given window is linked across multiple sessions. In the case of
> grouped sessions, only those windows explicitly linked via lastw are
> counted. This is so that the flag doesn't always return 1 for windows in
> grouped sessions.
>
> To make this flag printable as part of the window_flags without hardcoding
> it, and to not leave an extra space present (because no window flags means a
> single space is printed), this extra space has been removed, and the default
> options changed to add the space back in, so there's no regressions.
>
> This means it's now entirely possible to override the window printable flags
> through formats alone, albeit long-winded.
> ---
> format.c | 3 +++
> options-table.c | 4 ++--
> session.c | 19 +++++++++++++++++++
> tmux.1 | 2 ++
> tmux.h | 1 +
> window.c | 4 +---
> 6 files changed, 28 insertions(+), 5 deletions(-)
>
> diff --git a/format.c b/format.c
> index 9e9b6c8..8733331 100644
> --- a/format.c
> +++ b/format.c
> @@ -602,6 +602,7 @@ format_defaults_winlink(struct format_tree *ft, struct
> session *s,
> {
> struct window *w = wl->window;
> char *flags;
> + int window_has_flags;
>
> if (ft->w == NULL)
> ft->w = wl->window;
> @@ -622,6 +623,8 @@ format_defaults_winlink(struct format_tree *ft, struct
> session *s,
> !!(wl->flags & WINLINK_SILENCE));
> format_add(ft, "window_last_flag", "%d",
> !!(wl == TAILQ_FIRST(&s->lastw)));
> + format_add(ft, "window_linked", "%d",
> + session_count_window_refs(s, wl) > 1);
>
> free(flags);
> }
> diff --git a/options-table.c b/options-table.c
> index a4f3ac4..0bf6558 100644
> --- a/options-table.c
> +++ b/options-table.c
> @@ -736,7 +736,7 @@ const struct options_table_entry window_options_table[] =
> {
>
> { .name = "window-status-current-format",
> .type = OPTIONS_TABLE_STRING,
> - .default_str = "#I:#W#F"
> + .default_str = "#I:#W#{?window_flags,#{window_flags},}"
> },
>
> { .name = "window-status-current-style",
> @@ -752,7 +752,7 @@ const struct options_table_entry window_options_table[] =
> {
>
> { .name = "window-status-format",
> .type = OPTIONS_TABLE_STRING,
> - .default_str = "#I:#W#F"
> + .default_str = "#I:#W#{?window_flags,#{window_flags}, }"
> },
>
> { .name = "window-status-last-attr",
> diff --git a/session.c b/session.c
> index 7d86f68..072c84b 100644
> --- a/session.c
> +++ b/session.c
> @@ -659,3 +659,22 @@ 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) {
> + /*
> + * We only want to consider unique links for each session in a
> + * group, and not all of them.
> + */
> + return (session_group_count(sg) - wl->window->references);
> + } else
> + return (wl->window->references);
> +}
> diff --git a/tmux.1 b/tmux.1
> index b97fd8a..f2861b9 100644
> --- a/tmux.1
> +++ b/tmux.1
> @@ -3345,11 +3345,13 @@ The following variables are available, where
> appropriate:
> .It Li "window_bell_flag" Ta "" Ta "1 if window has bell"
> .It Li "window_find_matches" Ta "" Ta "Matched data from the find-window"
> .It Li "window_flags" Ta "#F" Ta "Window flags"
> +.It Li "window_has_flags" Ta "1 if the window has flags"
> .It Li "window_height" Ta "" Ta "Height of window"
> .It Li "window_id" Ta "" Ta "Unique window ID"
> .It Li "window_index" Ta "#I" Ta "Index of window"
> .It Li "window_last_flag" Ta "" Ta "1 if window is the last used"
> .It Li "window_layout" Ta "" Ta "Window layout description"
> +.It Li "window_linked" Ta "" Ta "1 if window is linked across sessions"
> .It Li "window_name" Ta "#W" Ta "Name of window"
> .It Li "window_panes" Ta "" Ta "Number of panes in window"
> .It Li "window_silence_flag" Ta "" Ta "1 if window has silence alert"
> 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..2e4ddd0 100644
> --- a/window.c
> +++ b/window.c
> @@ -642,7 +642,7 @@ window_destroy_panes(struct window *w)
> }
> }
>
> -/* Return list of printable window flag symbols. No flags is just a space. */
> +/* Retuns the printable flags on a window, empty string if no flags set. */
> char *
> window_printable_flags(struct session *s, struct winlink *wl)
> {
> @@ -662,8 +662,6 @@ window_printable_flags(struct session *s, struct winlink
> *wl)
> flags[pos++] = '-';
> if (wl->window->flags & WINDOW_ZOOMED)
> flags[pos++] = 'Z';
> - if (pos == 0)
> - flags[pos++] = ' ';
> flags[pos] = '\0';
> return (xstrdup(flags));
> }
> --
> 2.1.4
>
------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users