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.
This commit is contained in:
Nicholas Marriott 2009-07-15 17:45:09 +00:00
parent ff90170738
commit 8bfbc8c61d
2 changed files with 37 additions and 13 deletions

View File

@ -1,4 +1,4 @@
/* $Id: cmd-kill-window.c,v 1.16 2009-07-14 06:43:32 nicm Exp $ */ /* $Id: cmd-kill-window.c,v 1.17 2009-07-15 17:45:09 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -44,24 +44,35 @@ cmd_kill_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{ {
struct cmd_target_data *data = self->data; struct cmd_target_data *data = self->data;
struct winlink *wl; struct winlink *wl;
struct window *w;
struct session *s; struct session *s;
struct client *c; struct client *c;
u_int i; u_int i, j;
int destroyed; int destroyed;
if ((wl = cmd_find_window(ctx, data->target, &s)) == NULL) if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return (-1); return (-1);
w = wl->window;
destroyed = session_detach(s, wl); for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { s = ARRAY_ITEM(&sessions, i);
c = ARRAY_ITEM(&clients, i); if (s == NULL || !session_has(s, w))
if (c == NULL || c->session != s)
continue; continue;
if (destroyed) { if ((wl = winlink_find_by_window(&s->windows, w)) == NULL)
c->session = NULL; continue;
server_write_client(c, MSG_EXIT, NULL, 0);
} else destroyed = session_detach(s, wl);
server_redraw_client(c); 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(); recalculate_sizes();

View File

@ -1,4 +1,4 @@
/* $Id: window.c,v 1.92 2009-07-15 17:43:21 nicm Exp $ */ /* $Id: window.c,v 1.93 2009-07-15 17:45:09 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -79,6 +79,19 @@ winlink_cmp(struct winlink *wl1, struct winlink *wl2)
return (wl1->idx - wl2->idx); return (wl1->idx - wl2->idx);
} }
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 * struct winlink *
winlink_find_by_index(struct winlinks *wwl, int idx) winlink_find_by_index(struct winlinks *wwl, int idx)
{ {