mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Add split-window -Z to start the pane zoomed, GitHub issue 2591.
This commit is contained in:
		@@ -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();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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))
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								layout.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								spawn.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								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);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								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 *);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user