Hi This looks great, except you need to call winlink_remove on the old winlink to remove the old win ref count and free the winlink. Also no point in the function returning an error that is never used or checking that s is NULL when it never can be :-).
Going to go with this, minor tweaks only: Index: cmd-move-window.c =================================================================== RCS file: /cvs/src/usr.bin/tmux/cmd-move-window.c,v retrieving revision 1.10 diff -u -p -r1.10 cmd-move-window.c --- cmd-move-window.c 4 Jan 2011 00:42:47 -0000 1.10 +++ cmd-move-window.c 29 Apr 2012 08:15:39 -0000 @@ -30,8 +30,8 @@ int cmd_move_window_exec(struct cmd *, s const struct cmd_entry cmd_move_window_entry = { "move-window", "movew", - "dks:t:", 0, 0, - "[-dk] " CMD_SRCDST_WINDOW_USAGE, + "dkrs:t:", 0, 0, + "[-dkr] " CMD_SRCDST_WINDOW_USAGE, 0, NULL, NULL, @@ -42,10 +42,21 @@ int cmd_move_window_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; - struct session *src, *dst; + struct session *src, *dst, *s; struct winlink *wl; char *cause; int idx, kflag, dflag; + + if ((s = ctx->curclient->session) == NULL) + return (-1); + + if (args_has(args, 'r')) + { + session_renumber_windows(s); + recalculate_sizes(); + + return (0); + } if ((wl = cmd_find_window(ctx, args_get(args, 's'), &src)) == NULL) return (-1); Index: options-table.c =================================================================== RCS file: /cvs/src/usr.bin/tmux/options-table.c,v retrieving revision 1.28 diff -u -p -r1.28 options-table.c --- options-table.c 23 Apr 2012 22:23:14 -0000 1.28 +++ options-table.c 29 Apr 2012 08:15:40 -0000 @@ -274,6 +274,11 @@ const struct options_table_entry session .default_num = KEYC_NONE, }, + { .name = "renumber-windows", + .type = OPTIONS_TABLE_FLAG, + .default_num = 0 + }, + { .name = "repeat-time", .type = OPTIONS_TABLE_NUMBER, .minimum = 0, Index: server-fn.c =================================================================== RCS file: /cvs/src/usr.bin/tmux/server-fn.c,v retrieving revision 1.55 diff -u -p -r1.55 server-fn.c --- server-fn.c 17 Mar 2012 22:35:09 -0000 1.55 +++ server-fn.c 29 Apr 2012 08:15:40 -0000 @@ -263,6 +263,9 @@ server_kill_window(struct window *w) } else server_redraw_session_group(s); } + + if (options_get_number(&s->options, "renumber-windows")) + session_renumber_windows(s); } } Index: session.c =================================================================== RCS file: /cvs/src/usr.bin/tmux/session.c,v retrieving revision 1.33 diff -u -p -r1.33 session.c --- session.c 17 Mar 2012 22:35:09 -0000 1.33 +++ session.c 29 Apr 2012 08:15:40 -0000 @@ -591,3 +591,49 @@ session_group_synchronize1(struct sessio winlink_remove(&old_windows, wl); } } + +/* Renumber the windows across winlinks attached to a specific session. */ +void +session_renumber_windows(struct session *s) +{ + struct winlink *wl, *wl1, *wl_new; + struct winlinks old_wins; + struct winlink_stack old_lastw; + int new_idx, new_curw_idx; + + /* Save and replace old window list. */ + 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"); + new_curw_idx = 0; + + /* 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. */ + 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. */ + s->curw = winlink_find_by_index(&s->windows, new_curw_idx); + + /* Free the old winlinks (reducing window references too). */ + RB_FOREACH_SAFE(wl, winlinks, &old_wins, wl1) + winlink_remove(&old_wins, wl); +} Index: tmux.1 =================================================================== RCS file: /cvs/src/usr.bin/tmux/tmux.1,v retrieving revision 1.290 diff -u -p -r1.290 tmux.1 --- tmux.1 23 Apr 2012 22:23:14 -0000 1.290 +++ tmux.1 29 Apr 2012 08:15:42 -0000 @@ -1258,7 +1258,7 @@ and .Ar dst-pane may belong to the same window. .It Xo Ic move-window -.Op Fl dk +.Op Fl rdk .Op Fl s Ar src-window .Op Fl t Ar dst-window .Xc @@ -1269,6 +1269,12 @@ except the window at .Ar src-window is moved to .Ar dst-window . +With +.Fl r , +all windows in the session are renumbered in sequential order, respecting +the +.Ic base-index +option. .It Xo Ic new-window .Op Fl adkP .Op Fl c Ar start-directory @@ -2122,6 +2128,15 @@ Set the pane border colour for panes asi Set the key accepted as a prefix key. .It Ic prefix2 Ar key Set a secondary key accepted as a prefix key. +.It Xo Ic renumber-windows +.Op Ic on | off +.Xc +If on, when a window is closed in a session, automatically renumber the other +windows in numerical order. +This respects the +.Ic base-index +option if it has been set. +If off, do not renumber the windows. .It Ic repeat-time Ar time Allow multiple commands to be entered without pressing the prefix-key again in the specified Index: tmux.h =================================================================== RCS file: /cvs/src/usr.bin/tmux/tmux.h,v retrieving revision 1.329 diff -u -p -r1.329 tmux.h --- tmux.h 25 Apr 2012 21:12:49 -0000 1.329 +++ tmux.h 29 Apr 2012 08:15:42 -0000 @@ -2116,6 +2116,7 @@ void session_group_remove(struct sessi 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 *); /* utf8.c */ void utf8_build(void); On Tue, Apr 24, 2012 at 11:07:40PM +0100, Thomas Adam wrote: > On Mon, Apr 23, 2012 at 11:25:28PM +0100, Nicholas Marriott wrote: > > Do we need a command at all or is the option enough? > > Well, I can already see people wanting both, and I see both as light-weight, > especially since both code-paths between a flag to move-window and a session > option call the same function. > > > If a manual trigger is really useful, could this be a flag to > > move-window? > > I've added it as a flag to move-window (-r). See patch attached. > > -- 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.) ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users