diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2009-07-15 08:00:49 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2009-07-15 08:00:49 +0000 |
commit | 9601b72e4ced58d08f4c1351865746b46ab5895e (patch) | |
tree | de17b881631bbc366a20e6e27e1a62ec041f7602 /cmd-kill-window.c | |
parent | ca617d679ff296a4abe0e7526d8e8cab4f87e338 (diff) | |
download | rtmux-9601b72e4ced58d08f4c1351865746b46ab5895e.tar.gz rtmux-9601b72e4ced58d08f4c1351865746b46ab5895e.tar.bz2 rtmux-9601b72e4ced58d08f4c1351865746b46ab5895e.zip |
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 (limited to 'cmd-kill-window.c')
-rw-r--r-- | cmd-kill-window.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/cmd-kill-window.c b/cmd-kill-window.c index ca9ee1fa..77b9b79d 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(); |