Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam
2020-07-04 16:01:20 +01:00
5 changed files with 75 additions and 31 deletions

View File

@ -159,7 +159,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
server_status_session(dst_s); server_status_session(dst_s);
if (window_count_panes(src_w) == 0) if (window_count_panes(src_w) == 0)
server_kill_window(src_w); server_kill_window(src_w, 1);
else else
notify_window("window-layout-changed", src_w); notify_window("window-layout-changed", src_w);
notify_window("window-layout-changed", dst_w); notify_window("window-layout-changed", dst_w);

View File

@ -57,9 +57,10 @@ cmd_kill_window_exec(struct cmd *self, struct cmdq_item *item)
{ {
struct args *args = cmd_get_args(self); struct args *args = cmd_get_args(self);
struct cmd_find_state *target = cmdq_get_target(item); struct cmd_find_state *target = cmdq_get_target(item);
struct winlink *wl = target->wl, *wl2, *wl3; struct winlink *wl = target->wl, *loop;
struct window *w = wl->window; struct window *w = wl->window;
struct session *s = target->s; struct session *s = target->s;
u_int found;
if (cmd_get_entry(self) == &cmd_unlink_window_entry) { if (cmd_get_entry(self) == &cmd_unlink_window_entry) {
if (!args_has(args, 'k') && !session_is_linked(s, w)) { if (!args_has(args, 'k') && !session_is_linked(s, w)) {
@ -67,16 +68,43 @@ cmd_kill_window_exec(struct cmd *self, struct cmdq_item *item)
return (CMD_RETURN_ERROR); return (CMD_RETURN_ERROR);
} }
server_unlink_window(s, wl); server_unlink_window(s, wl);
} else { recalculate_sizes();
if (args_has(args, 'a')) { return (CMD_RETURN_NORMAL);
RB_FOREACH_SAFE(wl2, winlinks, &s->windows, wl3) {
if (wl != wl2)
server_kill_window(wl2->window);
}
} else
server_kill_window(wl->window);
} }
recalculate_sizes(); if (args_has(args, 'a')) {
if (RB_PREV(winlinks, &s->windows, wl) == NULL &&
RB_NEXT(winlinks, &s->windows, wl) == NULL)
return (CMD_RETURN_NORMAL);
/* Kill all windows except the current one. */
do {
found = 0;
RB_FOREACH(loop, winlinks, &s->windows) {
if (loop->window != wl->window) {
server_kill_window(loop->window, 0);
found++;
break;
}
}
} while (found != 0);
/*
* If the current window appears in the session more than once,
* kill it as well.
*/
found = 0;
RB_FOREACH(loop, winlinks, &s->windows) {
if (loop->window == wl->window)
found++;
}
if (found > 1)
server_kill_window(wl->window, 0);
server_renumber_all();
return (CMD_RETURN_NORMAL);
}
server_kill_window(wl->window, 1);
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
} }

View File

@ -181,7 +181,7 @@ server_kill_pane(struct window_pane *wp)
struct window *w = wp->window; struct window *w = wp->window;
if (window_count_panes(w) == 1) { if (window_count_panes(w) == 1) {
server_kill_window(w); server_kill_window(w, 1);
recalculate_sizes(); recalculate_sizes();
} else { } else {
server_unzoom_window(w); server_unzoom_window(w);
@ -193,19 +193,15 @@ server_kill_pane(struct window_pane *wp)
} }
void void
server_kill_window(struct window *w) server_kill_window(struct window *w, int renumber)
{ {
struct session *s, *next_s, *target_s; struct session *s, *s1;
struct session_group *sg; struct winlink *wl;
struct winlink *wl;
next_s = RB_MIN(sessions, &sessions);
while (next_s != NULL) {
s = next_s;
next_s = RB_NEXT(sessions, &sessions, s);
RB_FOREACH_SAFE(s, sessions, &sessions, s1) {
if (!session_has(s, w)) if (!session_has(s, w))
continue; continue;
server_unzoom_window(w); server_unzoom_window(w);
while ((wl = winlink_find_by_window(&s->windows, w)) != NULL) { while ((wl = winlink_find_by_window(&s->windows, w)) != NULL) {
if (session_detach(s, wl)) { if (session_detach(s, wl)) {
@ -215,17 +211,35 @@ server_kill_window(struct window *w)
server_redraw_session_group(s); server_redraw_session_group(s);
} }
if (options_get_number(s->options, "renumber-windows")) { if (renumber)
if ((sg = session_group_contains(s)) != NULL) { server_renumber_session(s);
TAILQ_FOREACH(target_s, &sg->sessions, gentry)
session_renumber_windows(target_s);
} else
session_renumber_windows(s);
}
} }
recalculate_sizes(); recalculate_sizes();
} }
void
server_renumber_session(struct session *s)
{
struct session_group *sg;
if (options_get_number(s->options, "renumber-windows")) {
if ((sg = session_group_contains(s)) != NULL) {
TAILQ_FOREACH(s, &sg->sessions, gentry)
session_renumber_windows(s);
} else
session_renumber_windows(s);
}
}
void
server_renumber_all(void)
{
struct session *s;
RB_FOREACH(s, sessions, &sessions)
server_renumber_session(s);
}
int int
server_link_window(struct session *src, struct winlink *srcwl, server_link_window(struct session *src, struct winlink *srcwl,
struct session *dst, int dstidx, int killflag, int selectflag, struct session *dst, int dstidx, int killflag, int selectflag,
@ -355,7 +369,7 @@ server_destroy_pane(struct window_pane *wp, int notify)
window_remove_pane(w, wp); window_remove_pane(w, wp);
if (TAILQ_EMPTY(&w->panes)) if (TAILQ_EMPTY(&w->panes))
server_kill_window(w); server_kill_window(w, 1);
else else
server_redraw_window(w); server_redraw_window(w);
} }

4
tmux.h
View File

@ -2422,7 +2422,9 @@ void server_lock(void);
void server_lock_session(struct session *); void server_lock_session(struct session *);
void server_lock_client(struct client *); void server_lock_client(struct client *);
void server_kill_pane(struct window_pane *); void server_kill_pane(struct window_pane *);
void server_kill_window(struct window *); void server_kill_window(struct window *, int);
void server_renumber_session(struct session *);
void server_renumber_all(void);
int server_link_window(struct session *, int server_link_window(struct session *,
struct winlink *, struct session *, int, int, int, char **); struct winlink *, struct session *, int, int, int, char **);
void server_unlink_window(struct session *, struct winlink *); void server_unlink_window(struct session *, struct winlink *);

View File

@ -1054,7 +1054,7 @@ window_tree_kill_each(__unused void *modedata, void *itemdata,
break; break;
case WINDOW_TREE_WINDOW: case WINDOW_TREE_WINDOW:
if (wl != NULL) if (wl != NULL)
server_kill_window(wl->window); server_kill_window(wl->window, 1);
break; break;
case WINDOW_TREE_PANE: case WINDOW_TREE_PANE:
if (wp != NULL) if (wp != NULL)