I think this should go in session.c.


On Sun, Apr 22, 2012 at 02:46:53PM +0100, Thomas Adam wrote:
> This is responsible for reassigning new index numbers to the winlinks in a
> given session.
> ---
>  trunk/tmux.h   |    2 ++
>  trunk/window.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 47 insertions(+)
> 
> diff --git a/trunk/tmux.h b/trunk/tmux.h
> index 23352d6..7f21754 100644
> --- a/trunk/tmux.h
> +++ b/trunk/tmux.h
> @@ -1995,6 +1995,8 @@ int              window_pane_visible(struct window_pane 
> *);
>  char         *window_pane_search(
>                    struct window_pane *, const char *, u_int *);
>  char         *window_printable_flags(struct session *, struct winlink *);
> +int           window_renumber_windows(struct session *);
> +
>  struct window_pane *window_pane_find_up(struct window_pane *);
>  struct window_pane *window_pane_find_down(struct window_pane *);
>  struct window_pane *window_pane_find_left(struct window_pane *);
> diff --git a/trunk/window.c b/trunk/window.c
> index fac56dc..445a02f 100644
> --- a/trunk/window.c
> +++ b/trunk/window.c
> @@ -1173,3 +1173,48 @@ window_pane_find_right(struct window_pane *wp)
>       }
>       return (NULL);
>  }
> +
> +/* Renumber the windows across winlinks attached to a specific session. */
> +int
> +window_renumber_windows(struct session *s)
> +{
> +     struct winlink          *wl, *wl_new;
> +     struct winlinks          old_wins;
> +     struct winlink_stack     old_lastw;
> +     int                      new_idx = 0, new_curw_idx = 0;
> +
> +     if (s == NULL)
> +             return (-1);
> +
> +     memcpy(&old_wins, &s->windows, sizeof old_wins);
> +     RB_INIT(&s->windows);
> +
> +     /* Start renumbering from the base-index if it's set. */
> +     new_idx = options_get_number(&s->options, "base-index");
> +
> +     /* Go through the winlinks and assign new indexes. */
> +     RB_FOREACH(wl, winlinks, &old_wins) {
> +             wl_new = winlink_add(&s->windows, new_idx);
> +             winlink_set_window(wl_new, wl->window);
> +             wl_new->flags |= wl->flags & WINLINK_ALERTFLAGS;
> +
> +             if (wl == s->curw)
> +                     new_curw_idx = wl_new->idx;
> +
> +             new_idx++;
> +     }
> +
> +     /* Fix the stack of last windows now that the IDs have changed. */
> +     memcpy(&old_lastw, &s->lastw, sizeof old_lastw);
> +     TAILQ_INIT(&s->lastw);
> +     TAILQ_FOREACH(wl, &old_lastw, sentry) {
> +             wl_new = winlink_find_by_index(&s->windows, wl->idx);
> +             if (wl_new != NULL)
> +                     TAILQ_INSERT_TAIL(&s->lastw, wl_new, sentry);
> +     }
> +
> +     /* Set the current window per the new id. */
> +     s->curw = winlink_find_by_index(&s->windows, new_curw_idx);
> +
> +     return (0);
> +}
> -- 
> 1.7.10
> 
> 
> ------------------------------------------------------------------------------
> For Developers, A Lot Can Happen In A Second.
> Boundary is the first to Know...and Tell You.
> Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
> http://p.sf.net/sfu/Boundary-d2dvs2
> _______________________________________________
> tmux-users mailing list
> tmux-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/tmux-users

------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to