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 <tho...@xteddy.org> > 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 tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users