aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2015-06-17 20:01:12 +0100
committerThomas Adam <thomas@xteddy.org>2015-06-17 20:01:12 +0100
commit21a2ccc5f16be454ed7a2fd47e65a51d5faa4597 (patch)
tree8e58252b5da492a2e4e0ed5fdc35e098ca05bfc1
parenta584e11d6bb5d2ab0e0476f6c1a821e865597053 (diff)
parent84f0622c852761a2d6688e944bc01a03af78c52a (diff)
downloadrtmux-21a2ccc5f16be454ed7a2fd47e65a51d5faa4597.tar.gz
rtmux-21a2ccc5f16be454ed7a2fd47e65a51d5faa4597.tar.bz2
rtmux-21a2ccc5f16be454ed7a2fd47e65a51d5faa4597.zip
Merge branch 'obsd-master'
-rw-r--r--cmd-move-window.c13
-rw-r--r--cmd-new-window.c18
-rw-r--r--cmd-queue.c50
-rw-r--r--tmux.18
-rw-r--r--tmux.h1
-rw-r--r--window.c25
6 files changed, 75 insertions, 40 deletions
diff --git a/cmd-move-window.c b/cmd-move-window.c
index e765b625..b15df4f6 100644
--- a/cmd-move-window.c
+++ b/cmd-move-window.c
@@ -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);
diff --git a/cmd-new-window.c b/cmd-new-window.c
index c05a0ce8..9cead449 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -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)
diff --git a/cmd-queue.c b/cmd-queue.c
index 61b14147..af987f59 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -25,6 +25,8 @@
#include "tmux.h"
+enum cmd_retval cmdq_continue_one(struct cmd_q *);
+
/* Create new command queue. */
struct cmd_q *
cmdq_new(struct client *c)
@@ -160,14 +162,39 @@ cmdq_append(struct cmd_q *cmdq, struct cmd_list *cmdlist, struct mouse_event *m)
item->mouse.valid = 0;
}
+/* Process one command. */
+enum cmd_retval
+cmdq_continue_one(struct cmd_q *cmdq)
+{
+ struct cmd *cmd = cmdq->cmd;
+ enum cmd_retval retval;
+ char tmp[1024];
+ int flags = !!(cmd->flags & CMD_CONTROL);
+
+ cmd_print(cmd, tmp, sizeof tmp);
+ log_debug("cmdq %p: %s", cmdq, tmp);
+
+ cmdq->time = time(NULL);
+ cmdq->number++;
+
+ cmdq_guard(cmdq, "begin", flags);
+
+ retval = cmd->entry->exec(cmd, cmdq);
+
+ if (retval == CMD_RETURN_ERROR)
+ cmdq_guard(cmdq, "error", flags);
+ else
+ cmdq_guard(cmdq, "end", flags);
+ return (retval);
+}
+
/* Continue processing command queue. Returns 1 if finishes empty. */
int
cmdq_continue(struct cmd_q *cmdq)
{
struct cmd_q_item *next;
enum cmd_retval retval;
- int empty, flags;
- char s[1024];
+ int empty;
cmdq->references++;
notify_disable();
@@ -184,23 +211,7 @@ cmdq_continue(struct cmd_q *cmdq)
do {
while (cmdq->cmd != NULL) {
- cmd_print(cmdq->cmd, s, sizeof s);
- log_debug("cmdq %p: %s (client %d)", cmdq, s,
- cmdq->client != NULL ? cmdq->client->ibuf.fd : -1);
-
- cmdq->time = time(NULL);
- cmdq->number++;
-
- flags = !!(cmdq->cmd->flags & CMD_CONTROL);
- cmdq_guard(cmdq, "begin", flags);
-
- retval = cmdq->cmd->entry->exec(cmdq->cmd, cmdq);
-
- if (retval == CMD_RETURN_ERROR)
- cmdq_guard(cmdq, "error", flags);
- else
- cmdq_guard(cmdq, "end", flags);
-
+ retval = cmdq_continue_one(cmdq);
if (retval == CMD_RETURN_ERROR)
break;
if (retval == CMD_RETURN_WAIT)
@@ -209,7 +220,6 @@ cmdq_continue(struct cmd_q *cmdq)
cmdq_flush(cmdq);
goto empty;
}
-
cmdq->cmd = TAILQ_NEXT(cmdq->cmd, qentry);
}
next = TAILQ_NEXT(cmdq->item, qentry);
diff --git a/tmux.1 b/tmux.1
index 962300b8..c3fcfdaf 100644
--- a/tmux.1
+++ b/tmux.1
@@ -1548,7 +1548,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
@@ -1562,6 +1562,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
@@ -1627,7 +1631,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
diff --git a/tmux.h b/tmux.h
index b0d009d8..f0fef0d5 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2170,6 +2170,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 *);
diff --git a/window.c b/window.c
index 23da0ef9..fab9949e 100644
--- a/window.c
+++ b/window.c
@@ -1392,3 +1392,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);
+}