Add split-window -Z to start the pane zoomed, GitHub issue 2591.

This commit is contained in:
nicm 2021-03-11 06:31:05 +00:00
parent 7f87280cd5
commit d98f9f7fe5
14 changed files with 51 additions and 37 deletions

View File

@ -147,7 +147,7 @@ cmd_join_pane_exec(struct cmd *self, struct cmdq_item *item)
TAILQ_INSERT_BEFORE(dst_wp, src_wp, entry); TAILQ_INSERT_BEFORE(dst_wp, src_wp, entry);
else else
TAILQ_INSERT_AFTER(&dst_w->panes, dst_wp, src_wp, entry); 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(); recalculate_sizes();

View File

@ -52,7 +52,7 @@ cmd_rotate_window_exec(struct cmd *self, struct cmdq_item *item)
struct layout_cell *lc; struct layout_cell *lc;
u_int sx, sy, xoff, yoff; 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')) { if (args_has(args, 'D')) {
wp = TAILQ_LAST(&w->panes, window_panes); wp = TAILQ_LAST(&w->panes, window_panes);

View File

@ -117,7 +117,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
server_redraw_window_borders(lastwp->window); server_redraw_window_borders(lastwp->window);
server_status_window(lastwp->window); server_status_window(lastwp->window);
} else { } else {
if (window_push_zoom(w, args_has(args, 'Z'))) if (window_push_zoom(w, 0, args_has(args, 'Z')))
server_redraw_window(w); server_redraw_window(w);
window_redraw_active_switch(w, lastwp); window_redraw_active_switch(w, lastwp);
if (window_set_active_pane(w, lastwp, 1)) { 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')) { if (args_has(args, 'L')) {
window_push_zoom(w, 1); window_push_zoom(w, 0, 1);
wp = window_pane_find_left(wp); wp = window_pane_find_left(wp);
window_pop_zoom(w); window_pop_zoom(w);
} else if (args_has(args, 'R')) { } else if (args_has(args, 'R')) {
window_push_zoom(w, 1); window_push_zoom(w, 0, 1);
wp = window_pane_find_right(wp); wp = window_pane_find_right(wp);
window_pop_zoom(w); window_pop_zoom(w);
} else if (args_has(args, 'U')) { } else if (args_has(args, 'U')) {
window_push_zoom(w, 1); window_push_zoom(w, 0, 1);
wp = window_pane_find_up(wp); wp = window_pane_find_up(wp);
window_pop_zoom(w); window_pop_zoom(w);
} else if (args_has(args, 'D')) { } else if (args_has(args, 'D')) {
window_push_zoom(w, 1); window_push_zoom(w, 0, 1);
wp = window_pane_find_down(wp); wp = window_pane_find_down(wp);
window_pop_zoom(w); window_pop_zoom(w);
} }
@ -220,7 +220,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
activewp = w->active; activewp = w->active;
if (wp == activewp) if (wp == activewp)
return (CMD_RETURN_NORMAL); 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); server_redraw_window(w);
window_redraw_active_switch(w, wp); window_redraw_active_switch(w, wp);
if (c != NULL && c->session != NULL && (c->flags & CLIENT_ACTIVEPANE)) if (c != NULL && c->session != NULL && (c->flags & CLIENT_ACTIVEPANE))

View File

@ -40,8 +40,8 @@ const struct cmd_entry cmd_split_window_entry = {
.name = "split-window", .name = "split-window",
.alias = "splitw", .alias = "splitw",
.args = { "bc:de:fF:hIl:p:Pt:v", 0, -1 }, .args = { "bc:de:fF:hIl:p:Pt:vZ", 0, -1 },
.usage = "[-bdefhIPv] [-c start-directory] [-e environment] " .usage = "[-bdefhIPvZ] [-c start-directory] [-e environment] "
"[-F format] [-l size] " CMD_TARGET_PANE_USAGE " [command]", "[-F format] [-l size] " CMD_TARGET_PANE_USAGE " [command]",
.target = { 't', CMD_FIND_PANE, 0 }, .target = { 't', CMD_FIND_PANE, 0 },
@ -111,7 +111,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
} else } else
size = -1; 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); input = (args_has(args, 'I') && args->argc == 0);
flags = 0; flags = 0;
@ -153,6 +153,8 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
sc.flags = flags; sc.flags = flags;
if (args_has(args, 'd')) if (args_has(args, 'd'))
sc.flags |= SPAWN_DETACHED; sc.flags |= SPAWN_DETACHED;
if (args_has(args, 'Z'))
sc.flags |= SPAWN_ZOOM;
if ((new_wp = spawn_pane(&sc, &cause)) == NULL) { if ((new_wp = spawn_pane(&sc, &cause)) == NULL) {
cmdq_error(item, "create pane failed: %s", cause); 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')) if (!args_has(args, 'd'))
cmd_find_from_winlink_pane(current, wl, new_wp, 0); cmd_find_from_winlink_pane(current, wl, new_wp, 0);
window_pop_zoom(wp->window);
server_redraw_window(wp->window); server_redraw_window(wp->window);
server_status_session(s); server_status_session(s);

View File

@ -58,7 +58,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmdq_item *item)
src_w = source->wl->window; src_w = source->wl->window;
src_wp = source->wp; 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); server_redraw_window(dst_w);
if (args_has(args, 'D')) { 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); 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); server_redraw_window(src_w);
if (src_wp == dst_wp) if (src_wp == dst_wp)

View File

@ -118,7 +118,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmdq_item *item)
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
if (wl != NULL && wp != NULL && wp != wl->window->active) { if (wl != NULL && wp != NULL && wp != wl->window->active) {
w = wl->window; 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); server_redraw_window(w);
window_redraw_active_switch(w, wp); window_redraw_active_switch(w, wp);
window_set_active_pane(w, wp, 1); window_set_active_pane(w, wp, 1);

View File

@ -233,7 +233,7 @@ layout_parse(struct window *w, const char *layout)
/* Update pane offsets and sizes. */ /* Update pane offsets and sizes. */
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
recalculate_sizes(); recalculate_sizes();
layout_print_cell(lc, __func__, 0); layout_print_cell(lc, __func__, 0);

View File

@ -160,7 +160,7 @@ layout_set_even(struct window *w, enum layout_type type)
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
layout_print_cell(w->layout_root, __func__, 1); layout_print_cell(w->layout_root, __func__, 1);
@ -270,7 +270,7 @@ layout_set_main_h(struct window *w)
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
layout_print_cell(w->layout_root, __func__, 1); layout_print_cell(w->layout_root, __func__, 1);
@ -368,7 +368,7 @@ layout_set_main_v(struct window *w)
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
layout_print_cell(w->layout_root, __func__, 1); layout_print_cell(w->layout_root, __func__, 1);
@ -477,7 +477,7 @@ layout_set_tiled(struct window *w)
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
layout_print_cell(w->layout_root, __func__, 1); layout_print_cell(w->layout_root, __func__, 1);

View File

@ -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. */ /* Update pane offsets and sizes based on their cells. */
void void
layout_fix_panes(struct window *w) layout_fix_panes(struct window *w, struct window_pane *skip)
{ {
struct window_pane *wp; struct window_pane *wp;
struct layout_cell *lc; struct layout_cell *lc;
@ -294,7 +294,7 @@ layout_fix_panes(struct window *w)
status = options_get_number(w->options, "pane-border-status"); status = options_get_number(w->options, "pane-border-status");
TAILQ_FOREACH(wp, &w->panes, entry) { TAILQ_FOREACH(wp, &w->panes, entry) {
if ((lc = wp->layout_cell) == NULL) if ((lc = wp->layout_cell) == NULL || wp == skip)
continue; continue;
wp->xoff = lc->xoff; 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); lc = w->layout_root = layout_create_cell(NULL);
layout_set_size(lc, w->sx, w->sy, 0, 0); layout_set_size(lc, w->sx, w->sy, 0, 0);
layout_make_leaf(lc, wp); layout_make_leaf(lc, wp);
layout_fix_panes(w); layout_fix_panes(w, NULL);
} }
void void
@ -540,7 +540,7 @@ layout_resize(struct window *w, u_int sx, u_int sy)
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
} }
/* Resize a pane to an absolute size. */ /* Resize a pane to an absolute size. */
@ -600,7 +600,7 @@ layout_resize_layout(struct window *w, struct layout_cell *lc,
/* Fix cell offsets. */ /* Fix cell offsets. */
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
notify_window("window-layout-changed", w); 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. */ /* Assign window pane to newly split cell. */
void 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_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. */ /* Calculate the new pane size for resized parent. */
@ -1040,7 +1044,7 @@ layout_close_pane(struct window_pane *wp)
/* Fix pane offsets and sizes. */ /* Fix pane offsets and sizes. */
if (w->layout_root != NULL) { if (w->layout_root != NULL) {
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
} }
notify_window("window-layout-changed", w); notify_window("window-layout-changed", w);
} }
@ -1109,7 +1113,7 @@ layout_spread_out(struct window_pane *wp)
do { do {
if (layout_spread_cell(w, parent)) { if (layout_spread_cell(w, parent)) {
layout_fix_offsets(w); layout_fix_offsets(w);
layout_fix_panes(w); layout_fix_panes(w, NULL);
break; break;
} }
} while ((parent = parent->parent) != NULL); } while ((parent = parent->parent) != NULL);

View File

@ -1115,7 +1115,7 @@ options_push_changes(const char *name)
} }
if (strcmp(name, "pane-border-status") == 0) { if (strcmp(name, "pane-border-status") == 0) {
RB_FOREACH(w, windows, &windows) RB_FOREACH(w, windows, &windows)
layout_fix_panes(w); layout_fix_panes(w, NULL);
} }
RB_FOREACH(s, sessions, &sessions) RB_FOREACH(s, sessions, &sessions)
status_update_cache(s); status_update_cache(s);

View File

@ -261,7 +261,10 @@ spawn_pane(struct spawn_context *sc, char **cause)
layout_init(w, new_wp); layout_init(w, new_wp);
} else { } else {
new_wp = window_add_pane(w, sc->wp0, hlimit, sc->flags); 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);
} }
/* /*

4
tmux.1
View File

@ -2804,7 +2804,7 @@ is given and the selected window is already the current window,
the command behaves like the command behaves like
.Ic last-window . .Ic last-window .
.It Xo Ic split-window .It Xo Ic split-window
.Op Fl bdfhIvP .Op Fl bdfhIvPZ
.Op Fl c Ar start-directory .Op Fl c Ar start-directory
.Op Fl e Ar environment .Op Fl e Ar environment
.Op Fl l Ar size .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 or full window width (with
.Fl v ) , .Fl v ) ,
instead of splitting the active pane. instead of splitting the active pane.
.Fl Z
zooms if the window is not zoomed, or keeps it zoomed if already zoomed.
.Pp .Pp
An empty An empty
.Ar shell-command .Ar shell-command

8
tmux.h
View File

@ -1862,6 +1862,7 @@ struct spawn_context {
#define SPAWN_NONOTIFY 0x10 #define SPAWN_NONOTIFY 0x10
#define SPAWN_FULLSIZE 0x20 #define SPAWN_FULLSIZE 0x20
#define SPAWN_EMPTY 0x40 #define SPAWN_EMPTY 0x40
#define SPAWN_ZOOM 0x80
}; };
/* Mode tree sort order. */ /* 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); void window_pane_send_resize(struct window_pane *, int);
int window_zoom(struct window_pane *); int window_zoom(struct window_pane *);
int window_unzoom(struct window *); 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 *); int window_pop_zoom(struct window *);
void window_lost_pane(struct window *, struct window_pane *); void window_lost_pane(struct window *, struct window_pane *);
void window_remove_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_leaf(struct layout_cell *, struct window_pane *);
void layout_make_node(struct layout_cell *, enum layout_type); void layout_make_node(struct layout_cell *, enum layout_type);
void layout_fix_offsets(struct window *); 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 *, void layout_resize_adjust(struct window *, struct layout_cell *,
enum layout_type, int); enum layout_type, int);
void layout_init(struct window *, struct window_pane *); void layout_init(struct window *, struct window_pane *);
@ -2825,7 +2826,8 @@ void layout_resize_pane(struct window_pane *, enum layout_type,
int, int); int, int);
void layout_resize_pane_to(struct window_pane *, enum layout_type, void layout_resize_pane_to(struct window_pane *, enum layout_type,
u_int); 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, struct layout_cell *layout_split_pane(struct window_pane *, enum layout_type,
int, int); int, int);
void layout_close_pane(struct window_pane *); void layout_close_pane(struct window_pane *);

View File

@ -622,18 +622,18 @@ window_unzoom(struct window *w)
wp->layout_cell = wp->saved_layout_cell; wp->layout_cell = wp->saved_layout_cell;
wp->saved_layout_cell = NULL; wp->saved_layout_cell = NULL;
} }
layout_fix_panes(w); layout_fix_panes(w, NULL);
notify_window("window-layout-changed", w); notify_window("window-layout-changed", w);
return (0); return (0);
} }
int 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, log_debug("%s: @%u %d", __func__, w->id,
flag && (w->flags & WINDOW_ZOOMED)); flag && (w->flags & WINDOW_ZOOMED));
if (flag && (w->flags & WINDOW_ZOOMED)) if (flag && (always || (w->flags & WINDOW_ZOOMED)))
w->flags |= WINDOW_WASZOOMED; w->flags |= WINDOW_WASZOOMED;
else else
w->flags &= ~WINDOW_WASZOOMED; w->flags &= ~WINDOW_WASZOOMED;