diff --git a/cmd-minimise-pane.c b/cmd-minimise-pane.c index 89e47c4e..29807608 100644 --- a/cmd-minimise-pane.c +++ b/cmd-minimise-pane.c @@ -30,7 +30,8 @@ static enum cmd_retval cmd_minimise_pane_minimise_exec(struct cmd *, struct cmdq_item *); static enum cmd_retval cmd_minimise_pane_unminimise_exec(struct cmd *, struct cmdq_item *); -static enum cmd_retval cmd_minimise_pane_minimise(struct window *, struct window_pane *); +static enum cmd_retval cmd_minimise_pane_minimise(struct window *, struct window_pane *, + struct cmdq_item *); static enum cmd_retval cmd_minimise_pane_unminimise(struct window *, struct window_pane *); const struct cmd_entry cmd_minimise_pane_entry = { @@ -73,12 +74,13 @@ cmd_minimise_pane_minimise_exec(struct cmd *self, struct cmdq_item *item) enum cmd_retval rv; if (args_has(args, 'a')) { + struct window_pane *active_pane = w->active; TAILQ_FOREACH(wp, &w->z_index, zentry) { - if (!window_pane_visible(wp)) + if (!window_pane_visible(wp) || wp == active_pane) continue; - rv = cmd_minimise_pane_minimise(w, wp); + rv = cmd_minimise_pane_minimise(w, wp, item); if (rv != CMD_RETURN_NORMAL) - return(rv); + return (rv); } return (CMD_RETURN_NORMAL); } else { @@ -95,7 +97,7 @@ cmd_minimise_pane_minimise_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "No target pane to miminise."); return (CMD_RETURN_ERROR); } - return(cmd_minimise_pane_minimise(w, wp)); + return (cmd_minimise_pane_minimise(w, wp, item)); } } @@ -117,7 +119,7 @@ cmd_minimise_pane_unminimise_exec(struct cmd *self, struct cmdq_item *item) continue; rv = cmd_minimise_pane_unminimise(w, wp); if (rv != CMD_RETURN_NORMAL) - return(rv); + return (rv); } return (CMD_RETURN_NORMAL); } else { @@ -134,23 +136,42 @@ cmd_minimise_pane_unminimise_exec(struct cmd *self, struct cmdq_item *item) cmdq_error(item, "No target pane to unmiminise."); return (CMD_RETURN_ERROR); } - return(cmd_minimise_pane_unminimise(w, wp)); + return (cmd_minimise_pane_unminimise(w, wp)); } } static enum cmd_retval -cmd_minimise_pane_minimise(struct window *w, struct window_pane *wp) +cmd_minimise_pane_minimise(struct window *w, struct window_pane *wp, + __attribute__((unused)) struct cmdq_item *item) { - struct window_pane *wp2; + struct window_pane *pwp = NULL; - /* Ignore if already minimised to prevent double-redistribution. */ if (wp->flags & PANE_MINIMISED) return (CMD_RETURN_NORMAL); - wp->flags |= PANE_MINIMISED; - window_deactivate_pane(w, wp, 1); + if (wp == w->active) { + /* + * Unzoom before searching: under zoom, window_pane_visible + * returns false for every non-active pane. + */ + if (w->flags & WINDOW_ZOOMED) + window_unzoom(w, 1); + /* Find previous active pane. */ + TAILQ_FOREACH(pwp, &w->last_panes, sentry) { + if (pwp != wp && window_pane_visible(pwp)) + break; + } + if (pwp == NULL) { + TAILQ_FOREACH(pwp, &w->z_index, zentry) { + if (pwp != wp && + window_pane_visible(pwp)) + break; + } + } + } + + wp->flags |= PANE_MINIMISED; - /* Fix pane offsets and sizes. */ if (w->layout_root != NULL) { wp->saved_layout_cell = wp->layout_cell; layout_minimise_cell(w, wp->layout_cell); @@ -158,17 +179,22 @@ cmd_minimise_pane_minimise(struct window *w, struct window_pane *wp) layout_fix_panes(w, NULL); } - /* Find next visible window in z-index. */ - TAILQ_FOREACH(wp2, &w->z_index, zentry) { - if (!window_pane_visible(wp2)) - continue; - break; + window_pane_stack_remove(&w->last_panes, wp); + if (pwp != NULL) { + window_set_active_pane(w, pwp, 1); + } else if (wp == w->active) { + /* No visible previous active pane; null active pane + * to show dots background. */ + w->active = NULL; + if (options_get_number(global_options, "focus-events")) + window_pane_update_focus(wp); + notify_window("window-pane-changed", w); + notify_window("window-layout-changed", w); + server_redraw_window(w); + } else { + notify_window("window-layout-changed", w); + server_redraw_window(w); } - if (wp2 != NULL) - window_set_active_pane(w, wp2, 1); - - notify_window("window-layout-changed", w); - server_redraw_window(w); return (CMD_RETURN_NORMAL); } diff --git a/control-notify.c b/control-notify.c index 0ced0c87..ba93c627 100644 --- a/control-notify.c +++ b/control-notify.c @@ -77,6 +77,9 @@ control_notify_window_pane_changed(struct window *w) { struct client *c; + if (w->active == NULL) + return; + TAILQ_FOREACH(c, &clients, entry) { if (!CONTROL_SHOULD_NOTIFY_CLIENT(c)) continue; diff --git a/server-client.c b/server-client.c index 9ca4b289..b5e56060 100644 --- a/server-client.c +++ b/server-client.c @@ -2197,7 +2197,7 @@ server_client_set_path(struct client *c) struct session *s = c->session; const char *path; - if (s->curw == NULL) + if (s->curw == NULL || s->curw->window->active == NULL) return; if (s->curw->window->active->base.path == NULL) path = ""; @@ -2217,7 +2217,7 @@ server_client_set_progress_bar(struct client *c) struct session *s = c->session; struct progress_bar *pane_pb; - if (s->curw == NULL) + if (s->curw == NULL || s->curw->window->active == NULL) return; pane_pb = &s->curw->window->active->base.progress_bar; if (pane_pb->state == c->progress_bar.state && diff --git a/tmux.h b/tmux.h index 02e010fd..b3b841fc 100644 --- a/tmux.h +++ b/tmux.h @@ -3412,8 +3412,6 @@ struct window_pane *window_find_string(struct window *, const char *); int window_has_pane(struct window *, struct window_pane *); int window_set_active_pane(struct window *, struct window_pane *, int); -int window_deactivate_pane(struct window *, struct window_pane *, - int); void window_update_focus(struct window *); void window_pane_update_focus(struct window_pane *); void window_redraw_active_switch(struct window *, diff --git a/window.c b/window.c index f6141170..cf9e8649 100644 --- a/window.c +++ b/window.c @@ -570,32 +570,6 @@ window_set_active_pane(struct window *w, struct window_pane *wp, int notify) return (1); } -int -window_deactivate_pane(struct window *w, struct window_pane *wp, int notify) -{ - struct window_pane *lastwp; - - log_debug("%s: pane %%%u", __func__, wp->id); - - if (w->flags & WINDOW_ZOOMED) - window_unzoom(w, 1); - lastwp = w->active; - - window_pane_stack_remove(&w->last_panes, wp); - window_pane_stack_push(&w->last_panes, lastwp); - - w->active = NULL; - - if (options_get_number(global_options, "focus-events")) { - window_pane_update_focus(lastwp); - } - - tty_update_window_offset(w); - - if (notify) - notify_window("window-pane-changed", w); - return (1); -} static int window_pane_get_palette(struct window_pane *wp, int c)