4 * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
27 static enum cmd_retval
cmd_kill_window_exec(struct cmd
*, struct cmdq_item
*);
29 const struct cmd_entry cmd_kill_window_entry
= {
30 .name
= "kill-window",
33 .args
= { "at:", 0, 0, NULL
},
34 .usage
= "[-a] " CMD_TARGET_WINDOW_USAGE
,
36 .target
= { 't', CMD_FIND_WINDOW
, 0 },
39 .exec
= cmd_kill_window_exec
42 const struct cmd_entry cmd_unlink_window_entry
= {
43 .name
= "unlink-window",
46 .args
= { "kt:", 0, 0, NULL
},
47 .usage
= "[-k] " CMD_TARGET_WINDOW_USAGE
,
49 .target
= { 't', CMD_FIND_WINDOW
, 0 },
52 .exec
= cmd_kill_window_exec
55 static enum cmd_retval
56 cmd_kill_window_exec(struct cmd
*self
, struct cmdq_item
*item
)
58 struct args
*args
= cmd_get_args(self
);
59 struct cmd_find_state
*target
= cmdq_get_target(item
);
60 struct winlink
*wl
= target
->wl
, *loop
;
61 struct window
*w
= wl
->window
;
62 struct session
*s
= target
->s
;
65 if (cmd_get_entry(self
) == &cmd_unlink_window_entry
) {
66 if (!args_has(args
, 'k') && !session_is_linked(s
, w
)) {
67 cmdq_error(item
, "window only linked to one session");
68 return (CMD_RETURN_ERROR
);
70 server_unlink_window(s
, wl
);
72 return (CMD_RETURN_NORMAL
);
75 if (args_has(args
, 'a')) {
76 if (RB_PREV(winlinks
, &s
->windows
, wl
) == NULL
&&
77 RB_NEXT(winlinks
, &s
->windows
, wl
) == NULL
)
78 return (CMD_RETURN_NORMAL
);
80 /* Kill all windows except the current one. */
83 RB_FOREACH(loop
, winlinks
, &s
->windows
) {
84 if (loop
->window
!= wl
->window
) {
85 server_kill_window(loop
->window
, 0);
93 * If the current window appears in the session more than once,
97 RB_FOREACH(loop
, winlinks
, &s
->windows
) {
98 if (loop
->window
== wl
->window
)
102 server_kill_window(wl
->window
, 0);
104 server_renumber_all();
105 return (CMD_RETURN_NORMAL
);
108 server_kill_window(wl
->window
, 1);
109 return (CMD_RETURN_NORMAL
);