mirror of
https://github.com/tmux/tmux.git
synced 2025-01-05 23:38:48 +00:00
Move the shuffle code from new-window -a into a function and add a -a
flag for move-window too. From Thomas Adam.
This commit is contained in:
parent
021cdbe1c0
commit
0ff335961e
@ -30,7 +30,7 @@ enum cmd_retval cmd_move_window_exec(struct cmd *, struct cmd_q *);
|
||||
|
||||
const struct cmd_entry cmd_move_window_entry = {
|
||||
"move-window", "movew",
|
||||
"dkrs:t:", 0, 0,
|
||||
"adkrs:t:", 0, 0,
|
||||
"[-dkr] " CMD_SRCDST_WINDOW_USAGE,
|
||||
0,
|
||||
cmd_move_window_exec
|
||||
@ -38,7 +38,7 @@ const struct cmd_entry cmd_move_window_entry = {
|
||||
|
||||
const struct cmd_entry cmd_link_window_entry = {
|
||||
"link-window", "linkw",
|
||||
"dks:t:", 0, 0,
|
||||
"adks:t:", 0, 0,
|
||||
"[-dk] " CMD_SRCDST_WINDOW_USAGE,
|
||||
0,
|
||||
cmd_move_window_exec
|
||||
@ -72,6 +72,15 @@ cmd_move_window_exec(struct cmd *self, struct cmd_q *cmdq)
|
||||
kflag = args_has(self->args, 'k');
|
||||
dflag = args_has(self->args, 'd');
|
||||
sflag = args_has(self->args, 's');
|
||||
|
||||
if (args_has(self->args, 'a')) {
|
||||
s = cmd_find_session(cmdq, args_get(args, 't'), 0);
|
||||
if (s == NULL)
|
||||
return (CMD_RETURN_ERROR);
|
||||
if ((idx = winlink_shuffle_up(s, s->curw)) == -1)
|
||||
return (CMD_RETURN_ERROR);
|
||||
}
|
||||
|
||||
if (server_link_window(src, wl, dst, idx, kflag, !dflag,
|
||||
&cause) != 0) {
|
||||
cmdq_error(cmdq, "can't link window: %s", cause);
|
||||
|
@ -51,7 +51,7 @@ cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
|
||||
struct winlink *wl;
|
||||
const char *cmd, *path, *template;
|
||||
char **argv, *cause, *cp;
|
||||
int argc, idx, last, detached, cwd, fd = -1;
|
||||
int argc, idx, detached, cwd, fd = -1;
|
||||
struct format_tree *ft;
|
||||
struct environ_entry *envent;
|
||||
|
||||
@ -59,24 +59,10 @@ cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
|
||||
wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
|
||||
if (wl == NULL)
|
||||
return (CMD_RETURN_ERROR);
|
||||
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) {
|
||||
if ((idx = winlink_shuffle_up(s, wl)) == -1) {
|
||||
cmdq_error(cmdq, "no free window indexes");
|
||||
return (CMD_RETURN_ERROR);
|
||||
}
|
||||
|
||||
/* 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 {
|
||||
idx = cmd_find_index(cmdq, args_get(args, 't'), &s);
|
||||
if (idx == -2)
|
||||
|
8
tmux.1
8
tmux.1
@ -1544,7 +1544,7 @@ If no
|
||||
.Ar target-session
|
||||
is specified, select the last window of the current session.
|
||||
.It Xo Ic link-window
|
||||
.Op Fl dk
|
||||
.Op Fl adk
|
||||
.Op Fl s Ar src-window
|
||||
.Op Fl t Ar dst-window
|
||||
.Xc
|
||||
@ -1558,6 +1558,10 @@ If
|
||||
is specified and no such window exists, the
|
||||
.Ar src-window
|
||||
is linked there.
|
||||
With
|
||||
.Fl a ,
|
||||
the window is moved to the next index up (following windows
|
||||
are moved if necessary).
|
||||
If
|
||||
.Fl k
|
||||
is given and
|
||||
@ -1623,7 +1627,7 @@ and
|
||||
.Ar dst-pane
|
||||
may belong to the same window.
|
||||
.It Xo Ic move-window
|
||||
.Op Fl rdk
|
||||
.Op Fl ardk
|
||||
.Op Fl s Ar src-window
|
||||
.Op Fl t Ar dst-window
|
||||
.Xc
|
||||
|
1
tmux.h
1
tmux.h
@ -2166,6 +2166,7 @@ struct window_pane *window_pane_find_right(struct window_pane *);
|
||||
void window_set_name(struct window *, const char *);
|
||||
void window_remove_ref(struct window *);
|
||||
void winlink_clear_flags(struct winlink *);
|
||||
int winlink_shuffle_up(struct session *, struct winlink *);
|
||||
|
||||
/* layout.c */
|
||||
u_int layout_count_cells(struct layout_cell *);
|
||||
|
25
window.c
25
window.c
@ -1378,3 +1378,28 @@ winlink_clear_flags(struct winlink *wl)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
winlink_shuffle_up(struct session *s, struct winlink *wl)
|
||||
{
|
||||
int idx, last;
|
||||
|
||||
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)
|
||||
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);
|
||||
}
|
||||
|
||||
return (idx);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user