On Tue, Jan 03, 2017 at 12:33:42PM +0000, Nicholas Marriott wrote: > It can be in w->flags, or alternatively just walk the sessions, a flag > would be faster though.
Have a look at the patch attached; seems to work for me, including using grouped sessions. I've removed session_is_linked() as a result. There's no longer a need for it. Kindly, Thomas -- You received this message because you are subscribed to the Google Groups "tmux-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
commit 925a266a68c6c7473ce8d40077b373628c021f4c Author: Thomas Adam <[email protected]> Date: Fri Jan 6 17:32:16 2017 +0000 Handle linked windows with a dedicated flag diff --git a/cmd-kill-window.c b/cmd-kill-window.c index 6365aecb..a2a2d18e 100644 --- a/cmd-kill-window.c +++ b/cmd-kill-window.c @@ -61,7 +61,7 @@ cmd_kill_window_exec(struct cmd *self, struct cmdq_item *item) struct session *s = item->state.tflag.s; if (self->entry == &cmd_unlink_window_entry) { - if (!args_has(self->args, 'k') && !session_is_linked(s, w)) { + if (!args_has(self->args, 'k') && !(w->flags & WINDOW_LINKED)) { cmdq_error(item, "window only linked to one session"); return (CMD_RETURN_ERROR); } diff --git a/format.c b/format.c index 70704f01..11b1a89f 100644 --- a/format.c +++ b/format.c @@ -1164,7 +1164,7 @@ 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_is_linked(s, wl->window)); + format_add(ft, "window_linked", "%d", w->flags & WINDOW_LINKED); free(flags); } diff --git a/server-fn.c b/server-fn.c index 83b3fe86..fcc2b08f 100644 --- a/server-fn.c +++ b/server-fn.c @@ -233,7 +233,7 @@ server_link_window(struct session *src, struct winlink *srcwl, struct session *dst, int dstidx, int killflag, int selectflag, char **cause) { - struct winlink *dstwl; + struct winlink *dstwl, *wl; struct session_group *srcsg, *dstsg; srcsg = session_group_find(src); @@ -276,6 +276,9 @@ server_link_window(struct session *src, struct winlink *srcwl, if (dstwl == NULL) return (-1); + if ((wl = winlink_find_by_window(&dst->windows, dstwl->window)) != NULL) + wl->window->flags |= WINDOW_LINKED; + if (selectflag) session_select(dst, dstwl->idx); server_redraw_session_group(dst); @@ -286,10 +289,17 @@ server_link_window(struct session *src, struct winlink *srcwl, void server_unlink_window(struct session *s, struct winlink *wl) { + struct winlink *wl1; + if (session_detach(s, wl)) server_destroy_session_group(s); else server_redraw_session_group(s); + + wl->window->flags &= ~WINDOW_LINKED; + + TAILQ_FOREACH(wl1, &wl->window->winlinks, wentry) + wl1->window->flags &= ~WINDOW_LINKED; } void diff --git a/session.c b/session.c index d89bc6a0..49254c28 100644 --- a/session.c +++ b/session.c @@ -417,20 +417,6 @@ session_has(struct session *s, struct window *w) 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); -} - static struct winlink * session_next_alert(struct winlink *wl) { diff --git a/tmux.h b/tmux.h index faf5688e..57a12b8a 100644 --- a/tmux.h +++ b/tmux.h @@ -892,6 +892,7 @@ struct window { #define WINDOW_FORCEWIDTH 0x2000 #define WINDOW_FORCEHEIGHT 0x4000 #define WINDOW_STYLECHANGED 0x8000 +#define WINDOW_LINKED 0x10000 #define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE) int alerts_queued; @@ -2265,7 +2266,6 @@ struct winlink *session_attach(struct session *, struct window *, int, 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);
