diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2010-03-27 11:46:58 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2010-03-27 11:46:58 +0000 |
commit | d3d85c3df9970820eb114c6fb6378f4db72e1d3c (patch) | |
tree | 6dbc05f7417c4b18d673f7cc88c461b4d9f29e69 | |
parent | d267845cfcdfaad214e1d34d55637fb9f9c2c11b (diff) | |
download | rtmux-d3d85c3df9970820eb114c6fb6378f4db72e1d3c.tar.gz rtmux-d3d85c3df9970820eb114c6fb6378f4db72e1d3c.tar.bz2 rtmux-d3d85c3df9970820eb114c6fb6378f4db72e1d3c.zip |
-a flag to insert a window after an existing one, moving other windows
up necessary.
-rw-r--r-- | cmd-new-window.c | 38 | ||||
-rw-r--r-- | tmux.1 | 11 |
2 files changed, 43 insertions, 6 deletions
diff --git a/cmd-new-window.c b/cmd-new-window.c index ea3cff4a..cf32f29e 100644 --- a/cmd-new-window.c +++ b/cmd-new-window.c @@ -36,13 +36,14 @@ struct cmd_new_window_data { char *target; char *name; char *cmd; + int flag_insert_after; int flag_detached; int flag_kill; }; const struct cmd_entry cmd_new_window_entry = { "new-window", "neww", - "[-dk] [-n window-name] [-t target-window] [command]", + "[-adk] [-n window-name] [-t target-window] [command]", 0, "", cmd_new_window_init, cmd_new_window_parse, @@ -61,6 +62,7 @@ cmd_new_window_init(struct cmd *self, unused int arg) data->target = NULL; data->name = NULL; data->cmd = NULL; + data->flag_insert_after = 0; data->flag_detached = 0; data->flag_kill = 0; } @@ -74,8 +76,11 @@ cmd_new_window_parse(struct cmd *self, int argc, char **argv, char **cause) self->entry->init(self, KEYC_NONE); data = self->data; - while ((opt = getopt(argc, argv, "dkt:n:")) != -1) { + while ((opt = getopt(argc, argv, "adkt:n:")) != -1) { switch (opt) { + case 'a': + data->flag_insert_after = 1; + break; case 'd': data->flag_detached = 1; break; @@ -118,13 +123,36 @@ cmd_new_window_exec(struct cmd *self, struct cmd_ctx *ctx) struct session *s; struct winlink *wl; char *cmd, *cwd, *cause; - int idx; + int idx, last; if (data == NULL) return (0); - if ((idx = cmd_find_index(ctx, data->target, &s)) == -2) - return (-1); + if (data->flag_insert_after) { + if ((wl = cmd_find_window(ctx, data->target, &s)) == NULL) + return (-1); + idx = wl->idx + 1; + + /* Find the next free index. */ + for (last = idx; last < INT_MAX; last++) { + if (winlink_find_by_index(&s->windows, last) == NULL) + break; + } + if (last == INT_MAX) { + ctx->error(ctx, "no free window indexes"); + return (-1); + } + + /* Move everything from last - 1 to idx up a bit. */ + for (; last > idx; last--) { + wl = winlink_find_by_index(&s->windows, last - 1); + server_link_window(s, wl, s, last, 0, 0, NULL); + server_unlink_window(s, wl); + } + } else { + if ((idx = cmd_find_index(ctx, data->target, &s)) == -2) + return (-1); + } wl = NULL; if (idx != -1) @@ -976,13 +976,22 @@ except the window at is moved to .Ar dst-window . .It Xo Ic new-window -.Op Fl dk +.Op Fl adk .Op Fl n Ar window-name .Op Fl t Ar target-window .Op Ar shell-command .Xc .D1 (alias: Ic neww ) Create a new window. +With +.Fl a , +the new window is inserted at the next index up from the specified +.Ar target-window , +moving windows up if necessary, +otherwise +.Ar target-window +is the new window location. +.Pp If .Fl d is given, the session does not make the new window the current window. |