summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/Makefile3
-rw-r--r--usr.bin/tmux/cmd-kill-window.c45
-rw-r--r--usr.bin/tmux/cmd-unlink-window.c68
-rw-r--r--usr.bin/tmux/session.c20
-rw-r--r--usr.bin/tmux/tmux.h3
5 files changed, 55 insertions, 84 deletions
diff --git a/usr.bin/tmux/Makefile b/usr.bin/tmux/Makefile
index f7ce3b383b4..6548d8b68eb 100644
--- a/usr.bin/tmux/Makefile
+++ b/usr.bin/tmux/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.74 2014/10/20 23:01:51 nicm Exp $
+# $OpenBSD: Makefile,v 1.75 2014/10/22 23:11:41 nicm Exp $
PROG= tmux
SRCS= arguments.c \
@@ -69,7 +69,6 @@ SRCS= arguments.c \
cmd-swap-window.c \
cmd-switch-client.c \
cmd-unbind-key.c \
- cmd-unlink-window.c \
cmd-wait-for.c \
cmd.c \
cmd-queue.c \
diff --git a/usr.bin/tmux/cmd-kill-window.c b/usr.bin/tmux/cmd-kill-window.c
index ef51ca8692b..c5f08fda15e 100644
--- a/usr.bin/tmux/cmd-kill-window.c
+++ b/usr.bin/tmux/cmd-kill-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-kill-window.c,v 1.15 2014/10/20 22:29:25 nicm Exp $ */
+/* $OpenBSD: cmd-kill-window.c,v 1.16 2014/10/22 23:11:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -34,23 +34,48 @@ const struct cmd_entry cmd_kill_window_entry = {
cmd_kill_window_exec
};
+const struct cmd_entry cmd_unlink_window_entry = {
+ "unlink-window", "unlinkw",
+ "kt:", 0, 0,
+ "[-k] " CMD_TARGET_WINDOW_USAGE,
+ 0,
+ cmd_kill_window_exec
+};
+
enum cmd_retval
cmd_kill_window_exec(struct cmd *self, struct cmd_q *cmdq)
{
- struct args *args = self->args;
- struct winlink *wl, *wl2, *wl3;
- struct session *s;
+ struct args *args = self->args;
+ struct winlink *wl, *wl2, *wl3;
+ struct window *w;
+ struct session *s;
+ struct session_group *sg;
+ u_int references;
if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
return (CMD_RETURN_ERROR);
+ w = wl->window;
- if (args_has(args, 'a')) {
- RB_FOREACH_SAFE(wl2, winlinks, &s->windows, wl3) {
- if (wl != wl2)
- server_kill_window(wl2->window);
+ if (self->entry == &cmd_unlink_window_entry) {
+ sg = session_group_find(s);
+ if (sg != NULL)
+ references = session_group_count(sg);
+ else
+ references = 1;
+ if (!args_has(self->args, 'k') && w->references == references) {
+ cmdq_error(cmdq, "window only linked to one session");
+ return (CMD_RETURN_ERROR);
}
- } else
- server_kill_window(wl->window);
+ server_unlink_window(s, wl);
+ } else {
+ if (args_has(args, 'a')) {
+ RB_FOREACH_SAFE(wl2, winlinks, &s->windows, wl3) {
+ if (wl != wl2)
+ server_kill_window(wl2->window);
+ }
+ } else
+ server_kill_window(wl->window);
+ }
recalculate_sizes();
return (CMD_RETURN_NORMAL);
diff --git a/usr.bin/tmux/cmd-unlink-window.c b/usr.bin/tmux/cmd-unlink-window.c
deleted file mode 100644
index 62016db3f6a..00000000000
--- a/usr.bin/tmux/cmd-unlink-window.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $OpenBSD: cmd-unlink-window.c,v 1.14 2014/10/20 22:29:25 nicm Exp $ */
-
-/*
- * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
- * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/types.h>
-
-#include "tmux.h"
-
-/*
- * Unlink a window, unless it would be destroyed by doing so (only one link).
- */
-
-enum cmd_retval cmd_unlink_window_exec(struct cmd *, struct cmd_q *);
-
-const struct cmd_entry cmd_unlink_window_entry = {
- "unlink-window", "unlinkw",
- "kt:", 0, 0,
- "[-k] " CMD_TARGET_WINDOW_USAGE,
- 0,
- cmd_unlink_window_exec
-};
-
-enum cmd_retval
-cmd_unlink_window_exec(struct cmd *self, struct cmd_q *cmdq)
-{
- struct args *args = self->args;
- struct winlink *wl;
- struct window *w;
- struct session *s, *s2;
- struct session_group *sg;
- u_int references;
-
- if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
- return (CMD_RETURN_ERROR);
- w = wl->window;
-
- sg = session_group_find(s);
- if (sg != NULL) {
- references = 0;
- TAILQ_FOREACH(s2, &sg->sessions, gentry)
- references++;
- } else
- references = 1;
-
- if (!args_has(self->args, 'k') && w->references == references) {
- cmdq_error(cmdq, "window is only linked to one session");
- return (CMD_RETURN_ERROR);
- }
-
- server_unlink_window(s, wl);
- recalculate_sizes();
-
- return (CMD_RETURN_NORMAL);
-}
diff --git a/usr.bin/tmux/session.c b/usr.bin/tmux/session.c
index cafe4e81448..d2f03c42a28 100644
--- a/usr.bin/tmux/session.c
+++ b/usr.bin/tmux/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.44 2014/05/13 08:08:32 nicm Exp $ */
+/* $OpenBSD: session.c,v 1.45 2014/10/22 23:11:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -492,6 +492,19 @@ session_group_remove(struct session *s)
}
}
+/* Count number of sessions in session group. */
+u_int
+session_group_count(struct session_group *sg)
+{
+ struct session *s;
+ u_int n;
+
+ n = 0;
+ TAILQ_FOREACH(s, &sg->sessions, gentry)
+ n++;
+ return (n);
+}
+
/* Synchronize a session to its session group. */
void
session_group_synchronize_to(struct session *s)
@@ -579,8 +592,9 @@ session_group_synchronize1(struct session *target, struct session *s)
/* Then free the old winlinks list. */
while (!RB_EMPTY(&old_windows)) {
wl = RB_ROOT(&old_windows);
- if (winlink_find_by_window_id(&s->windows, wl->window->id) == NULL)
- notify_window_unlinked(s, wl->window);
+ wl2 = winlink_find_by_window_id(&s->windows, wl->window->id);
+ if (wl2 == NULL)
+ notify_window_unlinked(s, wl->window);
winlink_remove(&old_windows, wl);
}
}
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 092fdf84fed..a04290a5558 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.477 2014/10/21 22:22:04 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.478 2014/10/22 23:11:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -2296,6 +2296,7 @@ struct session_group *session_group_find(struct session *);
u_int session_group_index(struct session_group *);
void session_group_add(struct session *, struct session *);
void session_group_remove(struct session *);
+u_int session_group_count(struct session_group *);
void session_group_synchronize_to(struct session *);
void session_group_synchronize_from(struct session *);
void session_group_synchronize1(struct session *, struct session *);