mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
This commit is contained in:
		| @@ -36,8 +36,8 @@ enum cmd_retval	 cmd_split_window_exec(struct cmd *, struct cmd_q *); | |||||||
|  |  | ||||||
| const struct cmd_entry cmd_split_window_entry = { | const struct cmd_entry cmd_split_window_entry = { | ||||||
| 	"split-window", "splitw", | 	"split-window", "splitw", | ||||||
| 	"c:dF:l:hp:Pt:v", 0, -1, | 	"bc:dF:l:hp:Pt:v", 0, -1, | ||||||
| 	"[-dhvP] [-c start-directory] [-F format] [-p percentage|-l size] " | 	"[-bdhvP] [-c start-directory] [-F format] [-p percentage|-l size] " | ||||||
| 	CMD_TARGET_PANE_USAGE " [command]", | 	CMD_TARGET_PANE_USAGE " [command]", | ||||||
| 	0, | 	0, | ||||||
| 	cmd_split_window_exec | 	cmd_split_window_exec | ||||||
| @@ -144,7 +144,8 @@ cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq) | |||||||
| 	if (*shell == '\0' || areshell(shell)) | 	if (*shell == '\0' || areshell(shell)) | ||||||
| 		shell = _PATH_BSHELL; | 		shell = _PATH_BSHELL; | ||||||
|  |  | ||||||
| 	if ((lc = layout_split_pane(wp, type, size, 0)) == NULL) { | 	lc = layout_split_pane(wp, type, size, args_has(args, 'b')); | ||||||
|  | 	if (lc == NULL) { | ||||||
| 		cause = xstrdup("pane too small"); | 		cause = xstrdup("pane too small"); | ||||||
| 		goto error; | 		goto error; | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -184,7 +184,9 @@ grid_view_insert_cells(struct grid *gd, u_int px, u_int py, u_int nx) | |||||||
| 	px = grid_view_x(gd, px); | 	px = grid_view_x(gd, px); | ||||||
| 	py = grid_view_y(gd, py); | 	py = grid_view_y(gd, py); | ||||||
|  |  | ||||||
| 	sx = grid_view_x(gd, gd->sx); | 	sx = grid_view_x(gd, gd->linedata[py].cellsize); | ||||||
|  | 	if (sx < px + nx) | ||||||
|  | 		sx = px + nx; | ||||||
|  |  | ||||||
| 	if (px == sx - 1) | 	if (px == sx - 1) | ||||||
| 		grid_clear(gd, px, py, 1, 1); | 		grid_clear(gd, px, py, 1, 1); | ||||||
| @@ -201,7 +203,9 @@ grid_view_delete_cells(struct grid *gd, u_int px, u_int py, u_int nx) | |||||||
| 	px = grid_view_x(gd, px); | 	px = grid_view_x(gd, px); | ||||||
| 	py = grid_view_y(gd, py); | 	py = grid_view_y(gd, py); | ||||||
|  |  | ||||||
| 	sx = grid_view_x(gd, gd->sx); | 	sx = grid_view_x(gd, gd->linedata[py].cellsize); | ||||||
|  | 	if (sx < px + nx) | ||||||
|  | 		sx = px + nx; | ||||||
|  |  | ||||||
| 	grid_move_cells(gd, px, px + nx, py, sx - px - nx); | 	grid_move_cells(gd, px, px + nx, py, sx - px - nx); | ||||||
| 	grid_clear(gd, sx - nx, py, px + nx - (sx - nx), 1); | 	grid_clear(gd, sx - nx, py, px + nx - (sx - nx), 1); | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								resize.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								resize.c
									
									
									
									
									
								
							| @@ -50,7 +50,7 @@ recalculate_sizes(void) | |||||||
| 	struct window		*w; | 	struct window		*w; | ||||||
| 	struct window_pane	*wp; | 	struct window_pane	*wp; | ||||||
| 	u_int			 i, j, ssx, ssy, has, limit; | 	u_int			 i, j, ssx, ssy, has, limit; | ||||||
| 	int			 flag, has_status, is_zoomed; | 	int			 flag, has_status, is_zoomed, forced; | ||||||
|  |  | ||||||
| 	RB_FOREACH(s, sessions, &sessions) { | 	RB_FOREACH(s, sessions, &sessions) { | ||||||
| 		has_status = options_get_number(&s->options, "status"); | 		has_status = options_get_number(&s->options, "status"); | ||||||
| @@ -116,18 +116,26 @@ recalculate_sizes(void) | |||||||
| 		if (ssx == UINT_MAX || ssy == UINT_MAX) | 		if (ssx == UINT_MAX || ssy == UINT_MAX) | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
|  | 		forced = 0; | ||||||
| 		limit = options_get_number(&w->options, "force-width"); | 		limit = options_get_number(&w->options, "force-width"); | ||||||
| 		if (limit >= PANE_MINIMUM && ssx > limit) | 		if (limit >= PANE_MINIMUM && ssx > limit) { | ||||||
| 			ssx = limit; | 			ssx = limit; | ||||||
|  | 			forced |= WINDOW_FORCEWIDTH; | ||||||
|  | 		} | ||||||
| 		limit = options_get_number(&w->options, "force-height"); | 		limit = options_get_number(&w->options, "force-height"); | ||||||
| 		if (limit >= PANE_MINIMUM && ssy > limit) | 		if (limit >= PANE_MINIMUM && ssy > limit) { | ||||||
| 			ssy = limit; | 			ssy = limit; | ||||||
|  | 			forced |= WINDOW_FORCEHEIGHT; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		if (w->sx == ssx && w->sy == ssy) | 		if (w->sx == ssx && w->sy == ssy) | ||||||
| 			continue; | 			continue; | ||||||
| 		log_debug("window size %u,%u (was %u,%u)", ssx, ssy, w->sx, | 		log_debug("window size %u,%u (was %u,%u)", ssx, ssy, w->sx, | ||||||
| 		    w->sy); | 		    w->sy); | ||||||
|  |  | ||||||
|  | 		w->flags &= ~(WINDOW_FORCEWIDTH|WINDOW_FORCEHEIGHT); | ||||||
|  | 		w->flags |= forced; | ||||||
|  |  | ||||||
| 		is_zoomed = w->flags & WINDOW_ZOOMED; | 		is_zoomed = w->flags & WINDOW_ZOOMED; | ||||||
| 		if (is_zoomed) | 		if (is_zoomed) | ||||||
| 			window_unzoom(w); | 			window_unzoom(w); | ||||||
|   | |||||||
| @@ -278,8 +278,37 @@ screen_redraw_draw_borders(struct client *c, int status, u_int top) | |||||||
| 	struct options		*oo = &c->session->options; | 	struct options		*oo = &c->session->options; | ||||||
| 	struct tty		*tty = &c->tty; | 	struct tty		*tty = &c->tty; | ||||||
| 	struct window_pane	*wp; | 	struct window_pane	*wp; | ||||||
| 	struct grid_cell	 active_gc, other_gc; | 	struct grid_cell	 active_gc, other_gc, msg_gc; | ||||||
| 	u_int		 	 i, j, type; | 	u_int		 	 i, j, type, msgx = 0, msgy = 0; | ||||||
|  | 	int			 small, flags; | ||||||
|  | 	char			 msg[256]; | ||||||
|  | 	const char		*tmp; | ||||||
|  | 	size_t			 msglen = 0; | ||||||
|  |  | ||||||
|  | 	small = (tty->sy - status + top > w->sy) || (tty->sx > w->sx); | ||||||
|  | 	if (small) { | ||||||
|  | 		flags = w->flags & (WINDOW_FORCEWIDTH|WINDOW_FORCEHEIGHT); | ||||||
|  | 		if (flags == (WINDOW_FORCEWIDTH|WINDOW_FORCEHEIGHT)) | ||||||
|  | 			tmp = "force-width, force-height"; | ||||||
|  | 		else if (flags == WINDOW_FORCEWIDTH) | ||||||
|  | 			tmp = "force-width"; | ||||||
|  | 		else if (flags == WINDOW_FORCEHEIGHT) | ||||||
|  | 			tmp = "force-height"; | ||||||
|  | 		else | ||||||
|  | 			tmp = "a smaller client"; | ||||||
|  | 		xsnprintf(msg, sizeof msg, "(size %ux%u from %s)", | ||||||
|  | 		    w->sx, w->sy, tmp); | ||||||
|  | 		msglen = strlen(msg); | ||||||
|  |  | ||||||
|  | 		if (tty->sy - 1 - status + top > w->sy && tty->sx >= msglen) { | ||||||
|  | 			msgx = tty->sx - msglen; | ||||||
|  | 			msgy = tty->sy - 1 - status + top; | ||||||
|  | 		} else if (tty->sx - w->sx > msglen) { | ||||||
|  | 			msgx = tty->sx - msglen; | ||||||
|  | 			msgy = tty->sy - 1 - status + top; | ||||||
|  | 		} else | ||||||
|  | 			small = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	style_apply(&other_gc, oo, "pane-border-style"); | 	style_apply(&other_gc, oo, "pane-border-style"); | ||||||
| 	style_apply(&active_gc, oo, "pane-active-border-style"); | 	style_apply(&active_gc, oo, "pane-active-border-style"); | ||||||
| @@ -290,6 +319,9 @@ screen_redraw_draw_borders(struct client *c, int status, u_int top) | |||||||
| 			type = screen_redraw_check_cell(c, i, j, &wp); | 			type = screen_redraw_check_cell(c, i, j, &wp); | ||||||
| 			if (type == CELL_INSIDE) | 			if (type == CELL_INSIDE) | ||||||
| 				continue; | 				continue; | ||||||
|  | 			if (type == CELL_OUTSIDE && | ||||||
|  | 			    small && i > msgx && j == msgy) | ||||||
|  | 				continue; | ||||||
| 			if (screen_redraw_check_active(i, j, type, w, wp)) | 			if (screen_redraw_check_active(i, j, type, w, wp)) | ||||||
| 				tty_attributes(tty, &active_gc); | 				tty_attributes(tty, &active_gc); | ||||||
| 			else | 			else | ||||||
| @@ -298,6 +330,13 @@ screen_redraw_draw_borders(struct client *c, int status, u_int top) | |||||||
| 			tty_putc(tty, CELL_BORDERS[type]); | 			tty_putc(tty, CELL_BORDERS[type]); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if (small) { | ||||||
|  | 		memcpy(&msg_gc, &grid_default_cell, sizeof msg_gc); | ||||||
|  | 		tty_attributes(tty, &msg_gc); | ||||||
|  | 		tty_cursor(tty, msgx, msgy); | ||||||
|  | 		tty_puts(tty, msg); | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Draw the panes. */ | /* Draw the panes. */ | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								tmux.1
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								tmux.1
									
									
									
									
									
								
							| @@ -1761,7 +1761,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 dhvP | .Op Fl bdhvP | ||||||
| .Op Fl c Ar start-directory | .Op Fl c Ar start-directory | ||||||
| .Oo Fl l | .Oo Fl l | ||||||
| .Ar size | | .Ar size | | ||||||
| @@ -1785,6 +1785,10 @@ and | |||||||
| .Fl p | .Fl p | ||||||
| options specify the size of the new pane in lines (for vertical split) or in | options specify the size of the new pane in lines (for vertical split) or in | ||||||
| cells (for horizontal split), or as a percentage, respectively. | cells (for horizontal split), or as a percentage, respectively. | ||||||
|  | The | ||||||
|  | .Fl b | ||||||
|  | option causes the new pane to be created to the left of or above | ||||||
|  | .Ar target-pane . | ||||||
| All other options have the same meaning as for the | All other options have the same meaning as for the | ||||||
| .Ic new-window | .Ic new-window | ||||||
| command. | command. | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -944,7 +944,9 @@ struct window { | |||||||
| #define WINDOW_ACTIVITY 0x2 | #define WINDOW_ACTIVITY 0x2 | ||||||
| #define WINDOW_REDRAW 0x4 | #define WINDOW_REDRAW 0x4 | ||||||
| #define WINDOW_SILENCE 0x8 | #define WINDOW_SILENCE 0x8 | ||||||
| #define WINDOW_ZOOMED 0x10 | #define WINDOW_ZOOMED 0x1000 | ||||||
|  | #define WINDOW_FORCEWIDTH 0x2000 | ||||||
|  | #define WINDOW_FORCEHEIGHT 0x4000 | ||||||
| #define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE) | #define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE) | ||||||
|  |  | ||||||
| 	struct options	 options; | 	struct options	 options; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Thomas Adam
					Thomas Adam