Are you sure this works? How does the flag get cleared if one of the
sessions is destroyed?
On Sat, Jul 15, 2017 at 08:39:15PM +0100, Thomas Adam wrote:
> The original implementation of working out if a window was linked used
> the window's reference count. This is fragile. Instead, use a flag on
> the winlink to indicate if a winlink is linked. This also avoids the
> need for counting winlinks (i.e., looping).
>
> No functional change.
> ---
> cmd-kill-window.c | 4 ++--
> format.c | 2 +-
> server-fn.c | 5 +++++
> session.c | 14 --------------
> tmux.h | 2 +-
> 5 files changed, 9 insertions(+), 18 deletions(-)
>
> diff --git a/cmd-kill-window.c b/cmd-kill-window.c
> index 50df83ee..90359b3e 100644
> --- a/cmd-kill-window.c
> +++ b/cmd-kill-window.c
> @@ -57,11 +57,11 @@ cmd_kill_window_exec(struct cmd *self, struct cmdq_item
> *item)
> {
> struct args *args = self->args;
> struct winlink *wl = item->target.wl, *wl2, *wl3;
> - struct window *w = wl->window;
> struct session *s = item->target.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') &&
> + !(wl->flags & WINLINK_LINKED)) {
> cmdq_error(item, "window only linked to one session");
> return (CMD_RETURN_ERROR);
> }
> diff --git a/format.c b/format.c
> index 6d7e5bfe..cd57e938 100644
> --- a/format.c
> +++ b/format.c
> @@ -1380,7 +1380,7 @@ format_defaults_winlink(struct format_tree *ft, struct
> winlink *wl)
> !!(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", !!(wl->flags & WINLINK_LINKED));
> }
>
> /* Set default format keys for a window pane. */
> diff --git a/server-fn.c b/server-fn.c
> index bf349469..879a8732 100644
> --- a/server-fn.c
> +++ b/server-fn.c
> @@ -260,12 +260,17 @@ server_link_window(struct session *src, struct winlink
> *srcwl,
> session_select(dst, dstwl->idx);
> server_redraw_session_group(dst);
>
> + srcwl->flags |= WINLINK_LINKED;
> + dstwl->flags |= WINLINK_LINKED;
> +
> return (0);
> }
>
> void
> server_unlink_window(struct session *s, struct winlink *wl)
> {
> + wl->flags &= ~WINLINK_LINKED;
> +
> if (session_detach(s, wl))
> server_destroy_session_group(s);
> else
> diff --git a/session.c b/session.c
> index 6143807c..011d2bdb 100644
> --- a/session.c
> +++ b/session.c
> @@ -437,20 +437,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_contains(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 c18958d9..610ac515 100644
> --- a/tmux.h
> +++ b/tmux.h
> @@ -888,6 +888,7 @@ struct winlink {
> #define WINLINK_ACTIVITY 0x2
> #define WINLINK_SILENCE 0x4
> #define WINLINK_ALERTFLAGS (WINLINK_BELL|WINLINK_ACTIVITY|WINLINK_SILENCE)
> +#define WINLINK_LINKED 0x8
>
> RB_ENTRY(winlink) entry;
> TAILQ_ENTRY(winlink) wentry;
> @@ -2310,7 +2311,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);
> --
> 2.13.2
>
> --
> 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.
--
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.