diff --git a/cmd-join-pane.c b/cmd-join-pane.c index fc95a6b8..3d3f0ac8 100644 --- a/cmd-join-pane.c +++ b/cmd-join-pane.c @@ -147,7 +147,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item) TAILQ_INSERT_BEFORE(dst_wp, src_wp, entry); else TAILQ_INSERT_AFTER(&dst_w->panes, dst_wp, src_wp, entry); - layout_assign_pane(lc, src_wp); + layout_assign_pane(lc, src_wp, 0); recalculate_sizes(); diff --git a/cmd-rotate-window.c b/cmd-rotate-window.c index 55c1dde2..450ffc17 100644 --- a/cmd-rotate-window.c +++ b/cmd-rotate-window.c @@ -52,7 +52,7 @@ cmd_rotate_window_exec(struct cmd *self, struct cmdq_item *item) struct layout_cell *lc; u_int sx, sy, xoff, yoff; - window_push_zoom(w, args_has(args, 'Z')); + window_push_zoom(w, 0, args_has(args, 'Z')); if (args_has(args, 'D')) { wp = TAILQ_LAST(&w->panes, window_panes); diff --git a/cmd-select-pane.c b/cmd-select-pane.c index fa388548..7871fe05 100644 --- a/cmd-select-pane.c +++ b/cmd-select-pane.c @@ -117,7 +117,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) server_redraw_window_borders(lastwp->window); server_status_window(lastwp->window); } else { - if (window_push_zoom(w, args_has(args, 'Z'))) + if (window_push_zoom(w, 0, args_has(args, 'Z'))) server_redraw_window(w); window_redraw_active_switch(w, lastwp); if (window_set_active_pane(w, lastwp, 1)) { @@ -171,19 +171,19 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) } if (args_has(args, 'L')) { - window_push_zoom(w, 1); + window_push_zoom(w, 0, 1); wp = window_pane_find_left(wp); window_pop_zoom(w); } else if (args_has(args, 'R')) { - window_push_zoom(w, 1); + window_push_zoom(w, 0, 1); wp = window_pane_find_right(wp); window_pop_zoom(w); } else if (args_has(args, 'U')) { - window_push_zoom(w, 1); + window_push_zoom(w, 0, 1); wp = window_pane_find_up(wp); window_pop_zoom(w); } else if (args_has(args, 'D')) { - window_push_zoom(w, 1); + window_push_zoom(w, 0, 1); wp = window_pane_find_down(wp); window_pop_zoom(w); } @@ -220,7 +220,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item) activewp = w->active; if (wp == activewp) return (CMD_RETURN_NORMAL); - if (window_push_zoom(w, args_has(args, 'Z'))) + if (window_push_zoom(w, 0, args_has(args, 'Z'))) server_redraw_window(w); window_redraw_active_switch(w, wp); if (c != NULL && c->session != NULL && (c->flags & CLIENT_ACTIVEPANE)) diff --git a/cmd-split-window.c b/cmd-split-window.c index c9d92fae..9e27bba1 100644 --- a/cmd-split-window.c +++ b/cmd-split-window.c @@ -40,8 +40,8 @@ const struct cmd_entry cmd_split_window_entry = { .name = "split-window", .alias = "splitw", - .args = { "bc:de:fF:hIl:p:Pt:v", 0, -1 }, - .usage = "[-bdefhIPv] [-c start-directory] [-e environment] " + .args = { "bc:de:fF:hIl:p:Pt:vZ", 0, -1 }, + .usage = "[-bdefhIPvZ] [-c start-directory] [-e environment] " "[-F format] [-l size] " CMD_TARGET_PANE_USAGE " [command]", .target = { 't', CMD_FIND_PANE, 0 }, @@ -111,7 +111,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item) } else size = -1; - server_unzoom_window(wp->window); + window_push_zoom(wp->window, 1, args_has(args, 'Z')); input = (args_has(args, 'I') && args->argc == 0); flags = 0; @@ -153,6 +153,8 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item) sc.flags = flags; if (args_has(args, 'd')) sc.flags |= SPAWN_DETACHED; + if (args_has(args, 'Z')) + sc.flags |= SPAWN_ZOOM; if ((new_wp = spawn_pane(&sc, &cause)) == NULL) { cmdq_error(item, "create pane failed: %s", cause); @@ -169,6 +171,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item) } if (!args_has(args, 'd')) cmd_find_from_winlink_pane(current, wl, new_wp, 0); + window_pop_zoom(wp->window); server_redraw_window(wp->window); server_status_session(s); diff --git a/cmd-swap-pane.c b/cmd-swap-pane.c index dd981b9a..12bc20b4 100644 --- a/cmd-swap-pane.c +++ b/cmd-swap-pane.c @@ -58,7 +58,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmdq_item *item) src_w = source->wl->window; src_wp = source->wp; - if (window_push_zoom(dst_w, args_has(args, 'Z'))) + if (window_push_zoom(dst_w, 0, args_has(args, 'Z'))) server_redraw_window(dst_w); if (args_has(args, 'D')) { @@ -73,7 +73,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmdq_item *item) src_wp = TAILQ_LAST(&dst_w->panes, window_panes); } - if (src_w != dst_w && window_push_zoom(src_w, args_has(args, 'Z'))) + if (src_w != dst_w && window_push_zoom(src_w, 0, args_has(args, 'Z'))) server_redraw_window(src_w); if (src_wp == dst_wp) diff --git a/cmd-switch-client.c b/cmd-switch-client.c index fc7f9d75..b10496e3 100644 --- a/cmd-switch-client.c +++ b/cmd-switch-client.c @@ -118,7 +118,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmdq_item *item) return (CMD_RETURN_NORMAL); if (wl != NULL && wp != NULL && wp != wl->window->active) { w = wl->window; - if (window_push_zoom(w, args_has(args, 'Z'))) + if (window_push_zoom(w, 0, args_has(args, 'Z'))) server_redraw_window(w); window_redraw_active_switch(w, wp); window_set_active_pane(w, wp, 1); diff --git a/layout-custom.c b/layout-custom.c index 097dabe6..e7fb4253 100644 --- a/layout-custom.c +++ b/layout-custom.c @@ -233,7 +233,7 @@ layout_parse(struct window *w, const char *layout) /* Update pane offsets and sizes. */ layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); recalculate_sizes(); layout_print_cell(lc, __func__, 0); diff --git a/layout-set.c b/layout-set.c index 9ef28416..c702817d 100644 --- a/layout-set.c +++ b/layout-set.c @@ -160,7 +160,7 @@ layout_set_even(struct window *w, enum layout_type type) /* Fix cell offsets. */ layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); layout_print_cell(w->layout_root, __func__, 1); @@ -270,7 +270,7 @@ layout_set_main_h(struct window *w) /* Fix cell offsets. */ layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); layout_print_cell(w->layout_root, __func__, 1); @@ -368,7 +368,7 @@ layout_set_main_v(struct window *w) /* Fix cell offsets. */ layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); layout_print_cell(w->layout_root, __func__, 1); @@ -477,7 +477,7 @@ layout_set_tiled(struct window *w) /* Fix cell offsets. */ layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); layout_print_cell(w->layout_root, __func__, 1); diff --git a/layout.c b/layout.c index 37214d02..04a13b0c 100644 --- a/layout.c +++ b/layout.c @@ -286,7 +286,7 @@ layout_add_border(struct window *w, struct layout_cell *lc, int status) /* Update pane offsets and sizes based on their cells. */ void -layout_fix_panes(struct window *w) +layout_fix_panes(struct window *w, struct window_pane *skip) { struct window_pane *wp; struct layout_cell *lc; @@ -294,7 +294,7 @@ layout_fix_panes(struct window *w) status = options_get_number(w->options, "pane-border-status"); TAILQ_FOREACH(wp, &w->panes, entry) { - if ((lc = wp->layout_cell) == NULL) + if ((lc = wp->layout_cell) == NULL || wp == skip) continue; wp->xoff = lc->xoff; @@ -482,7 +482,7 @@ layout_init(struct window *w, struct window_pane *wp) lc = w->layout_root = layout_create_cell(NULL); layout_set_size(lc, w->sx, w->sy, 0, 0); layout_make_leaf(lc, wp); - layout_fix_panes(w); + layout_fix_panes(w, NULL); } void @@ -540,7 +540,7 @@ layout_resize(struct window *w, u_int sx, u_int sy) /* Fix cell offsets. */ layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); } /* Resize a pane to an absolute size. */ @@ -600,7 +600,7 @@ layout_resize_layout(struct window *w, struct layout_cell *lc, /* Fix cell offsets. */ layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); notify_window("window-layout-changed", w); } @@ -704,10 +704,14 @@ layout_resize_pane_shrink(struct window *w, struct layout_cell *lc, /* Assign window pane to newly split cell. */ void -layout_assign_pane(struct layout_cell *lc, struct window_pane *wp) +layout_assign_pane(struct layout_cell *lc, struct window_pane *wp, + int do_not_resize) { layout_make_leaf(lc, wp); - layout_fix_panes(wp->window); + if (do_not_resize) + layout_fix_panes(wp->window, wp); + else + layout_fix_panes(wp->window, NULL); } /* Calculate the new pane size for resized parent. */ @@ -1040,7 +1044,7 @@ layout_close_pane(struct window_pane *wp) /* Fix pane offsets and sizes. */ if (w->layout_root != NULL) { layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); } notify_window("window-layout-changed", w); } @@ -1109,7 +1113,7 @@ layout_spread_out(struct window_pane *wp) do { if (layout_spread_cell(w, parent)) { layout_fix_offsets(w); - layout_fix_panes(w); + layout_fix_panes(w, NULL); break; } } while ((parent = parent->parent) != NULL); diff --git a/options.c b/options.c index 9bc89db3..52f4f67e 100644 --- a/options.c +++ b/options.c @@ -1115,7 +1115,7 @@ options_push_changes(const char *name) } if (strcmp(name, "pane-border-status") == 0) { RB_FOREACH(w, windows, &windows) - layout_fix_panes(w); + layout_fix_panes(w, NULL); } RB_FOREACH(s, sessions, &sessions) status_update_cache(s); diff --git a/spawn.c b/spawn.c index e3f8debe..98b70312 100644 --- a/spawn.c +++ b/spawn.c @@ -261,7 +261,10 @@ spawn_pane(struct spawn_context *sc, char **cause) layout_init(w, new_wp); } else { new_wp = window_add_pane(w, sc->wp0, hlimit, sc->flags); - layout_assign_pane(sc->lc, new_wp); + if (sc->flags & SPAWN_ZOOM) + layout_assign_pane(sc->lc, new_wp, 1); + else + layout_assign_pane(sc->lc, new_wp, 0); } /* diff --git a/tmux.1 b/tmux.1 index 8b83732e..da3c0e42 100644 --- a/tmux.1 +++ b/tmux.1 @@ -2804,7 +2804,7 @@ is given and the selected window is already the current window, the command behaves like .Ic last-window . .It Xo Ic split-window -.Op Fl bdfhIvP +.Op Fl bdfhIvPZ .Op Fl c Ar start-directory .Op Fl e Ar environment .Op Fl l Ar size @@ -2840,6 +2840,8 @@ option creates a new pane spanning the full window height (with or full window width (with .Fl v ) , instead of splitting the active pane. +.Fl Z +zooms if the window is not zoomed, or keeps it zoomed if already zoomed. .Pp An empty .Ar shell-command diff --git a/tmux.h b/tmux.h index d5e86e13..3a75e678 100644 --- a/tmux.h +++ b/tmux.h @@ -1862,6 +1862,7 @@ struct spawn_context { #define SPAWN_NONOTIFY 0x10 #define SPAWN_FULLSIZE 0x20 #define SPAWN_EMPTY 0x40 +#define SPAWN_ZOOM 0x80 }; /* Mode tree sort order. */ @@ -2752,7 +2753,7 @@ void window_resize(struct window *, u_int, u_int, int, int); void window_pane_send_resize(struct window_pane *, int); int window_zoom(struct window_pane *); int window_unzoom(struct window *); -int window_push_zoom(struct window *, int); +int window_push_zoom(struct window *, int, int); int window_pop_zoom(struct window *); void window_lost_pane(struct window *, struct window_pane *); void window_remove_pane(struct window *, struct window_pane *); @@ -2815,7 +2816,7 @@ void layout_set_size(struct layout_cell *, u_int, u_int, u_int, void layout_make_leaf(struct layout_cell *, struct window_pane *); void layout_make_node(struct layout_cell *, enum layout_type); void layout_fix_offsets(struct window *); -void layout_fix_panes(struct window *); +void layout_fix_panes(struct window *, struct window_pane *); void layout_resize_adjust(struct window *, struct layout_cell *, enum layout_type, int); void layout_init(struct window *, struct window_pane *); @@ -2825,7 +2826,8 @@ void layout_resize_pane(struct window_pane *, enum layout_type, int, int); void layout_resize_pane_to(struct window_pane *, enum layout_type, u_int); -void layout_assign_pane(struct layout_cell *, struct window_pane *); +void layout_assign_pane(struct layout_cell *, struct window_pane *, + int); struct layout_cell *layout_split_pane(struct window_pane *, enum layout_type, int, int); void layout_close_pane(struct window_pane *); diff --git a/window.c b/window.c index 07ef513f..36cf12d9 100644 --- a/window.c +++ b/window.c @@ -622,18 +622,18 @@ window_unzoom(struct window *w) wp->layout_cell = wp->saved_layout_cell; wp->saved_layout_cell = NULL; } - layout_fix_panes(w); + layout_fix_panes(w, NULL); notify_window("window-layout-changed", w); return (0); } int -window_push_zoom(struct window *w, int flag) +window_push_zoom(struct window *w, int always, int flag) { log_debug("%s: @%u %d", __func__, w->id, flag && (w->flags & WINDOW_ZOOMED)); - if (flag && (w->flags & WINDOW_ZOOMED)) + if (flag && (always || (w->flags & WINDOW_ZOOMED))) w->flags |= WINDOW_WASZOOMED; else w->flags &= ~WINDOW_WASZOOMED;