summaryrefslogtreecommitdiffstats
authornicm <nicm>2009-07-15 17:45:09 (GMT)
committer nicm <nicm>2009-07-15 17:45:09 (GMT)
commitd51521478f2e303f97081ff35575a72bdd4a7a35 (patch) (side-by-side diff)
treeeea73c91b02d46d134041fed27190cbdc889e1ce
parentff34a1441eb5ebe823a2e1365f72d94da4b7fd8f (diff)
downloadtmux-old-d51521478f2e303f97081ff35575a72bdd4a7a35.zip
tmux-old-d51521478f2e303f97081ff35575a72bdd4a7a35.tar.gz
tmux-old-d51521478f2e303f97081ff35575a72bdd4a7a35.tar.bz2
The man page says that kill-window removes the window entirely, unlinking it
from any sessions. In fact the implementation only affected the current session, making it the same as unlink-window but destroying the window if it was linked into only one session (unlinkw gives an error). Change the behaviour to match what it documented and was originally intended.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cmd-kill-window.c33
-rw-r--r--window.c13
2 files changed, 35 insertions, 11 deletions
diff --git a/cmd-kill-window.c b/cmd-kill-window.c
index c29e07f..1497037 100644
--- a/cmd-kill-window.c
+++ b/cmd-kill-window.c
@@ -44,24 +44,35 @@ cmd_kill_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct winlink *wl;
+ struct window *w;
struct session *s;
struct client *c;
- u_int i;
+ u_int i, j;
int destroyed;
- if ((wl = cmd_find_window(ctx, data->target, &s)) == NULL)
+ if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return (-1);
+ w = wl->window;
- destroyed = session_detach(s, wl);
- for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
- c = ARRAY_ITEM(&clients, i);
- if (c == NULL || c->session != s)
+ for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
+ s = ARRAY_ITEM(&sessions, i);
+ if (s == NULL || !session_has(s, w))
continue;
- if (destroyed) {
- c->session = NULL;
- server_write_client(c, MSG_EXIT, NULL, 0);
- } else
- server_redraw_client(c);
+ if ((wl = winlink_find_by_window(&s->windows, w)) == NULL)
+ continue;
+
+ destroyed = session_detach(s, wl);
+ for (j = 0; j < ARRAY_LENGTH(&clients); j++) {
+ c = ARRAY_ITEM(&clients, j);
+ if (c == NULL || c->session != s)
+ continue;
+
+ if (destroyed) {
+ c->session = NULL;
+ server_write_client(c, MSG_EXIT, NULL, 0);
+ } else
+ server_redraw_client(c);
+ }
}
recalculate_sizes();
diff --git a/window.c b/window.c
index d1314d4..fecbcae 100644
--- a/window.c
+++ b/window.c
@@ -80,6 +80,19 @@ winlink_cmp(struct winlink *wl1, struct winlink *wl2)
}
struct winlink *
+winlink_find_by_window(struct winlinks *wwl, struct window *w)
+{
+ struct winlink *wl;
+
+ RB_FOREACH(wl, winlinks, wwl) {
+ if (wl->window == w)
+ return (wl);
+ }
+
+ return (NULL);
+}
+
+struct winlink *
winlink_find_by_index(struct winlinks *wwl, int idx)
{
struct winlink wl;