mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
This commit is contained in:
		@@ -91,9 +91,8 @@ cmd_resize_pane_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (args_has(self->args, 'x')) {
 | 
			
		||||
		x = args_strtonum(self->args, 'x', PANE_MINIMUM, INT_MAX,
 | 
			
		||||
		    &cause);
 | 
			
		||||
	if (args_has(args, 'x')) {
 | 
			
		||||
		x = args_strtonum(args, 'x', PANE_MINIMUM, INT_MAX, &cause);
 | 
			
		||||
		if (cause != NULL) {
 | 
			
		||||
			cmdq_error(item, "width %s", cause);
 | 
			
		||||
			free(cause);
 | 
			
		||||
@@ -101,9 +100,8 @@ cmd_resize_pane_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
		}
 | 
			
		||||
		layout_resize_pane_to(wp, LAYOUT_LEFTRIGHT, x);
 | 
			
		||||
	}
 | 
			
		||||
	if (args_has(self->args, 'y')) {
 | 
			
		||||
		y = args_strtonum(self->args, 'y', PANE_MINIMUM, INT_MAX,
 | 
			
		||||
		    &cause);
 | 
			
		||||
	if (args_has(args, 'y')) {
 | 
			
		||||
		y = args_strtonum(args, 'y', PANE_MINIMUM, INT_MAX, &cause);
 | 
			
		||||
		if (cause != NULL) {
 | 
			
		||||
			cmdq_error(item, "height %s", cause);
 | 
			
		||||
			free(cause);
 | 
			
		||||
@@ -112,13 +110,13 @@ cmd_resize_pane_exec(struct cmd *self, struct cmdq_item *item)
 | 
			
		||||
		layout_resize_pane_to(wp, LAYOUT_TOPBOTTOM, y);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (args_has(self->args, 'L'))
 | 
			
		||||
	if (args_has(args, 'L'))
 | 
			
		||||
		layout_resize_pane(wp, LAYOUT_LEFTRIGHT, -adjust, 1);
 | 
			
		||||
	else if (args_has(self->args, 'R'))
 | 
			
		||||
	else if (args_has(args, 'R'))
 | 
			
		||||
		layout_resize_pane(wp, LAYOUT_LEFTRIGHT, adjust, 1);
 | 
			
		||||
	else if (args_has(self->args, 'U'))
 | 
			
		||||
	else if (args_has(args, 'U'))
 | 
			
		||||
		layout_resize_pane(wp, LAYOUT_TOPBOTTOM, -adjust, 1);
 | 
			
		||||
	else if (args_has(self->args, 'D'))
 | 
			
		||||
	else if (args_has(args, 'D'))
 | 
			
		||||
		layout_resize_pane(wp, LAYOUT_TOPBOTTOM, adjust, 1);
 | 
			
		||||
	server_redraw_window(wl->window);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								format.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								format.c
									
									
									
									
									
								
							@@ -1463,12 +1463,13 @@ format_defaults_winlink(struct format_tree *ft, struct winlink *wl)
 | 
			
		||||
void
 | 
			
		||||
format_defaults_pane(struct format_tree *ft, struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	struct window	*w = wp->window;
 | 
			
		||||
	struct grid	*gd = wp->base.grid;
 | 
			
		||||
	int  		 status = wp->status;
 | 
			
		||||
	u_int		 idx;
 | 
			
		||||
 | 
			
		||||
	if (ft->w == NULL)
 | 
			
		||||
		ft->w = wp->window;
 | 
			
		||||
		ft->w = w;
 | 
			
		||||
	ft->wp = wp;
 | 
			
		||||
 | 
			
		||||
	format_add(ft, "history_size", "%u", gd->hsize);
 | 
			
		||||
@@ -1483,7 +1484,7 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp)
 | 
			
		||||
	format_add(ft, "pane_height", "%u", wp->sy);
 | 
			
		||||
	format_add(ft, "pane_title", "%s", wp->base.title);
 | 
			
		||||
	format_add(ft, "pane_id", "%%%u", wp->id);
 | 
			
		||||
	format_add(ft, "pane_active", "%d", wp == wp->window->active);
 | 
			
		||||
	format_add(ft, "pane_active", "%d", wp == w->active);
 | 
			
		||||
	format_add(ft, "pane_input_off", "%d", !!(wp->flags & PANE_INPUTOFF));
 | 
			
		||||
	format_add(ft, "pane_pipe", "%d", wp->pipe_fd != -1);
 | 
			
		||||
 | 
			
		||||
@@ -1499,9 +1500,9 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp)
 | 
			
		||||
		format_add(ft, "pane_at_left", "%d", wp->xoff == 0);
 | 
			
		||||
		format_add(ft, "pane_at_top", "%d", wp->yoff == 0);
 | 
			
		||||
		format_add(ft, "pane_at_right", "%d",
 | 
			
		||||
		    wp->xoff + wp->sx == wp->window->sx);
 | 
			
		||||
		    wp->xoff + wp->sx == w->sx);
 | 
			
		||||
		format_add(ft, "pane_at_bottom", "%d",
 | 
			
		||||
		    wp->yoff + wp->sy == wp->window->sy);
 | 
			
		||||
		    wp->yoff + wp->sy == w->sy);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	format_add(ft, "pane_in_mode", "%d", wp->screen != &wp->base);
 | 
			
		||||
@@ -1509,7 +1510,7 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp)
 | 
			
		||||
		format_add(ft, "pane_mode", "%s", wp->mode->name);
 | 
			
		||||
 | 
			
		||||
	format_add(ft, "pane_synchronized", "%d",
 | 
			
		||||
	    !!options_get_number(wp->window->options, "synchronize-panes"));
 | 
			
		||||
	    !!options_get_number(w->options, "synchronize-panes"));
 | 
			
		||||
	if (wp->searchstr != NULL)
 | 
			
		||||
		format_add(ft, "pane_search_string", "%s", wp->searchstr);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,17 +35,6 @@ struct screen_redraw_ctx {
 | 
			
		||||
	u_int		 sy;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int	screen_redraw_cell_border1(struct window_pane *, u_int, u_int);
 | 
			
		||||
static int	screen_redraw_cell_border(struct client *, u_int, u_int);
 | 
			
		||||
static int	screen_redraw_check_cell(struct client *, u_int, u_int, int,
 | 
			
		||||
		    struct window_pane **);
 | 
			
		||||
static int	screen_redraw_check_is(u_int, u_int, int, int, struct window *,
 | 
			
		||||
		    struct window_pane *, struct window_pane *);
 | 
			
		||||
 | 
			
		||||
static int 	screen_redraw_make_pane_status(struct client *, struct window *,
 | 
			
		||||
		    struct window_pane *);
 | 
			
		||||
static void	screen_redraw_draw_pane_status(struct client *, int);
 | 
			
		||||
 | 
			
		||||
static void	screen_redraw_draw_borders(struct screen_redraw_ctx *);
 | 
			
		||||
static void	screen_redraw_draw_panes(struct screen_redraw_ctx *);
 | 
			
		||||
static void	screen_redraw_draw_status(struct screen_redraw_ctx *);
 | 
			
		||||
@@ -327,8 +316,9 @@ screen_redraw_make_pane_status(struct client *c, struct window *w,
 | 
			
		||||
 | 
			
		||||
/* Draw pane status. */
 | 
			
		||||
static void
 | 
			
		||||
screen_redraw_draw_pane_status(struct client *c, int pane_status)
 | 
			
		||||
screen_redraw_draw_pane_status(struct screen_redraw_ctx *ctx)
 | 
			
		||||
{
 | 
			
		||||
	struct client           *c = ctx->c;
 | 
			
		||||
	struct window		*w = c->session->curw->window;
 | 
			
		||||
	struct options		*oo = c->session->options;
 | 
			
		||||
	struct tty		*tty = &c->tty;
 | 
			
		||||
@@ -340,7 +330,7 @@ screen_redraw_draw_pane_status(struct client *c, int pane_status)
 | 
			
		||||
	TAILQ_FOREACH(wp, &w->panes, entry) {
 | 
			
		||||
		if (!window_pane_visible(wp))
 | 
			
		||||
			continue;
 | 
			
		||||
		if (pane_status == CELL_STATUS_TOP)
 | 
			
		||||
		if (ctx->pane_status == CELL_STATUS_TOP)
 | 
			
		||||
			yoff = wp->yoff - 1;
 | 
			
		||||
		else
 | 
			
		||||
			yoff = wp->yoff + wp->sy;
 | 
			
		||||
@@ -382,50 +372,51 @@ screen_redraw_update(struct client *c)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Set up redraw context. */
 | 
			
		||||
static void
 | 
			
		||||
screen_redraw_set_context(struct client *c, struct screen_redraw_ctx *ctx)
 | 
			
		||||
{
 | 
			
		||||
	struct session  *s = c->session;
 | 
			
		||||
	struct options  *oo = s->options;
 | 
			
		||||
	struct window   *w = s->curw->window;
 | 
			
		||||
	struct options  *wo = w->options;
 | 
			
		||||
 | 
			
		||||
	memset(ctx, 0, sizeof *ctx);
 | 
			
		||||
	ctx->c = c;
 | 
			
		||||
 | 
			
		||||
	ctx->lines = tty_status_lines(c);
 | 
			
		||||
	if (ctx->lines != 0 && options_get_number(oo, "status-position") == 0)
 | 
			
		||||
		ctx->top = 1;
 | 
			
		||||
	ctx->pane_status = options_get_number(wo, "pane-border-status");
 | 
			
		||||
 | 
			
		||||
	ctx->sx = c->tty.sx;
 | 
			
		||||
	ctx->sy = c->tty.sy - ctx->lines;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Redraw entire screen. */
 | 
			
		||||
void
 | 
			
		||||
screen_redraw_screen(struct client *c, int draw_panes, int draw_status,
 | 
			
		||||
    int draw_borders)
 | 
			
		||||
{
 | 
			
		||||
	struct options			*oo = c->session->options;
 | 
			
		||||
	struct tty			*tty = &c->tty;
 | 
			
		||||
	struct window			*w = c->session->curw->window;
 | 
			
		||||
	struct options			*wo = w->options;
 | 
			
		||||
	struct screen_redraw_ctx	 ctx;
 | 
			
		||||
 | 
			
		||||
	if (c->flags & CLIENT_SUSPENDED)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	memset(&ctx, 0, sizeof ctx);
 | 
			
		||||
	ctx.c = c;
 | 
			
		||||
 | 
			
		||||
	if (c->flags & CLIENT_STATUSOFF)
 | 
			
		||||
		ctx.lines = 0;
 | 
			
		||||
	else
 | 
			
		||||
		ctx.lines = status_line_size(c->session);
 | 
			
		||||
	if (c->message_string != NULL || c->prompt_string != NULL)
 | 
			
		||||
		ctx.lines = (ctx.lines == 0) ? 1 : ctx.lines;
 | 
			
		||||
 | 
			
		||||
	if (ctx.lines != 0 && options_get_number(oo, "status-position") == 0)
 | 
			
		||||
		ctx.top = 1;
 | 
			
		||||
	ctx.pane_status = options_get_number(wo, "pane-border-status");
 | 
			
		||||
 | 
			
		||||
	ctx.sx = tty->sx;
 | 
			
		||||
	ctx.sy = tty->sy - ctx.lines;
 | 
			
		||||
	screen_redraw_set_context(c, &ctx);
 | 
			
		||||
 | 
			
		||||
	if (ctx.lines == 0)
 | 
			
		||||
		draw_status = 0;
 | 
			
		||||
 | 
			
		||||
	if (draw_borders) {
 | 
			
		||||
		if (ctx.pane_status != CELL_STATUS_OFF)
 | 
			
		||||
			screen_redraw_draw_pane_status(c, ctx.pane_status);
 | 
			
		||||
	if (draw_borders)
 | 
			
		||||
		screen_redraw_draw_borders(&ctx);
 | 
			
		||||
	}
 | 
			
		||||
	if (draw_borders && ctx.pane_status != CELL_STATUS_OFF)
 | 
			
		||||
		screen_redraw_draw_pane_status(&ctx);
 | 
			
		||||
	if (draw_panes)
 | 
			
		||||
		screen_redraw_draw_panes(&ctx);
 | 
			
		||||
	if (draw_status)
 | 
			
		||||
		screen_redraw_draw_status(&ctx);
 | 
			
		||||
	tty_reset(tty);
 | 
			
		||||
	tty_reset(&c->tty);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Draw a single pane. */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1642,6 +1642,7 @@ struct environ *environ_for_session(struct session *, int);
 | 
			
		||||
 | 
			
		||||
/* tty.c */
 | 
			
		||||
void	tty_create_log(void);
 | 
			
		||||
u_int	tty_status_lines(struct client *);
 | 
			
		||||
void	tty_raw(struct tty *, const char *);
 | 
			
		||||
void	tty_attributes(struct tty *, const struct grid_cell *,
 | 
			
		||||
	    const struct window_pane *);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								tty.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								tty.c
									
									
									
									
									
								
							@@ -698,6 +698,21 @@ tty_repeat_space(struct tty *tty, u_int n)
 | 
			
		||||
		tty_putn(tty, s, n, n);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* How many lines are taken up by the status line on this client? */
 | 
			
		||||
u_int
 | 
			
		||||
tty_status_lines(struct client *c)
 | 
			
		||||
{
 | 
			
		||||
	u_int	lines;
 | 
			
		||||
 | 
			
		||||
	if (c->flags & CLIENT_STATUSOFF)
 | 
			
		||||
		lines = 0;
 | 
			
		||||
	else
 | 
			
		||||
		lines = status_line_size(c->session);
 | 
			
		||||
	if (c->message_string != NULL || c->prompt_string != NULL)
 | 
			
		||||
		lines = (lines == 0) ? 1 : lines;
 | 
			
		||||
	return (lines);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Is the region large enough to be worth redrawing once later rather than
 | 
			
		||||
 * probably several times now? Currently yes if it is more than 50% of the
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user