mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Instead of faking up a status line in status_redraw, use the same code to
redraw it as to draw the entire screen, just skip all lines but the last. This makes horizontal split redraw properly when the status line is off.
This commit is contained in:
		| @@ -63,9 +63,9 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py) | |||||||
| 	return (0); | 	return (0); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Redraw entire screen.. */ | /* Redraw entire screen. */ | ||||||
| void | void | ||||||
| screen_redraw_screen(struct client *c) | screen_redraw_screen(struct client *c, int status_only) | ||||||
| { | { | ||||||
| 	struct window		*w = c->session->curw->window; | 	struct window		*w = c->session->curw->window; | ||||||
| 	struct tty		*tty = &c->tty; | 	struct tty		*tty = &c->tty; | ||||||
| @@ -75,7 +75,16 @@ screen_redraw_screen(struct client *c) | |||||||
| 	u_char			 choriz, cvert, cbackg; | 	u_char			 choriz, cvert, cbackg; | ||||||
|  |  | ||||||
| 	/* Get status line, er, status. */ | 	/* Get status line, er, status. */ | ||||||
| 	status = options_get_number(&c->session->options, "status"); | 	if (c->message_string != NULL || c->prompt_string != NULL) | ||||||
|  | 		status = 1; | ||||||
|  | 	else | ||||||
|  | 		status = options_get_number(&c->session->options, "status"); | ||||||
|  |  | ||||||
|  | 	/* If only drawing status and it is present, don't need the rest. */ | ||||||
|  | 	if (status_only && status) { | ||||||
|  | 		tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/* Work out ACS characters. */ | 	/* Work out ACS characters. */ | ||||||
| 	if (tty_term_has(tty->term, TTYC_ACSC)) { | 	if (tty_term_has(tty->term, TTYC_ACSC)) { | ||||||
| @@ -95,6 +104,8 @@ screen_redraw_screen(struct client *c) | |||||||
| 	if (has_acs) | 	if (has_acs) | ||||||
| 		tty_putcode(tty, TTYC_SMACS); | 		tty_putcode(tty, TTYC_SMACS); | ||||||
| 	for (j = 0; j < tty->sy - status; j++) { | 	for (j = 0; j < tty->sy - status; j++) { | ||||||
|  | 		if (status_only && j != tty->sy - 1) | ||||||
|  | 			continue; | ||||||
| 		for (i = 0; i < tty->sx; i++) { | 		for (i = 0; i < tty->sx; i++) { | ||||||
| 			if (!screen_redraw_check_cell(c, i, j)) { | 			if (!screen_redraw_check_cell(c, i, j)) { | ||||||
| 				tty_cursor(tty, i, j, 0, 0); | 				tty_cursor(tty, i, j, 0, 0); | ||||||
| @@ -120,12 +131,16 @@ screen_redraw_screen(struct client *c) | |||||||
| 			tty_putcode(tty, TTYC_SMACS); | 			tty_putcode(tty, TTYC_SMACS); | ||||||
| 		if (wp->xoff > 0) { | 		if (wp->xoff > 0) { | ||||||
| 			for (i = wp->yoff; i < wp->yoff + sy; i++) { | 			for (i = wp->yoff; i < wp->yoff + sy; i++) { | ||||||
|  | 				if (status_only && i != tty->sy - 1) | ||||||
|  | 					continue; | ||||||
| 				tty_cursor(tty, wp->xoff - 1, i, 0, 0); | 				tty_cursor(tty, wp->xoff - 1, i, 0, 0); | ||||||
| 				tty_putc(tty, cvert); | 				tty_putc(tty, cvert); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if (wp->xoff + sx < tty->sx) { | 		if (wp->xoff + sx < tty->sx) { | ||||||
| 			for (i = wp->yoff; i < wp->yoff + sy; i++) { | 			for (i = wp->yoff; i < wp->yoff + sy; i++) { | ||||||
|  | 				if (status_only && i != tty->sy - 1) | ||||||
|  | 					continue; | ||||||
| 				tty_cursor(tty, wp->xoff + sx, i, 0, 0); | 				tty_cursor(tty, wp->xoff + sx, i, 0, 0); | ||||||
| 				tty_putc(&c->tty, cvert); | 				tty_putc(&c->tty, cvert); | ||||||
| 			} | 			} | ||||||
| @@ -133,24 +148,33 @@ screen_redraw_screen(struct client *c) | |||||||
|  |  | ||||||
| 		/* Draw top and bottom borders. */ | 		/* Draw top and bottom borders. */ | ||||||
| 		if (wp->yoff > 0) { | 		if (wp->yoff > 0) { | ||||||
| 			tty_cursor(tty, wp->xoff, wp->yoff - 1, 0, 0); | 			if (!status_only || wp->yoff - 1 == tty->sy - 1) { | ||||||
| 			for (i = 0; i < sx; i++) | 				tty_cursor(tty, wp->xoff, wp->yoff - 1, 0, 0); | ||||||
| 				tty_putc(tty, choriz); | 				for (i = 0; i < sx; i++) | ||||||
|  | 					tty_putc(tty, choriz); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 		if (wp->yoff + sy < tty->sy - status) { | 		if (wp->yoff + sy < tty->sy - status) { | ||||||
| 			tty_cursor(tty, wp->xoff, wp->yoff + sy, 0, 0); | 			if (!status_only || wp->yoff + sy == tty->sy - 1) { | ||||||
| 			for (i = 0; i < sx; i++) | 				tty_cursor(tty, wp->xoff, wp->yoff + sy, 0, 0); | ||||||
| 				tty_putc(tty, choriz); | 				for (i = 0; i < sx; i++) | ||||||
|  | 					tty_putc(tty, choriz); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 		if (has_acs) | 		if (has_acs) | ||||||
| 			tty_putcode(tty, TTYC_RMACS); | 			tty_putcode(tty, TTYC_RMACS); | ||||||
|  |  | ||||||
| 		/* Draw the pane. */ | 		/* Draw the pane. */ | ||||||
| 		screen_redraw_pane(c, wp); | 		for (i = 0; i < wp->sy; i++) { | ||||||
|  | 			if (status_only && i != tty->sy - 1) | ||||||
|  | 				continue; | ||||||
|  | 			tty_draw_line(tty, wp->screen, i, wp->xoff, wp->yoff); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Draw the status line. */ | 	/* Draw the status line. */ | ||||||
| 	screen_redraw_status(c); | 	if (status) | ||||||
|  | 		tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Draw a single pane. */ | /* Draw a single pane. */ | ||||||
| @@ -162,11 +186,3 @@ screen_redraw_pane(struct client *c, struct window_pane *wp) | |||||||
| 	for (i = 0; i < wp->sy; i++) | 	for (i = 0; i < wp->sy; i++) | ||||||
| 		tty_draw_line(&c->tty, wp->screen, i, wp->xoff, wp->yoff); | 		tty_draw_line(&c->tty, wp->screen, i, wp->xoff, wp->yoff); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Draw the status line. */ |  | ||||||
| void |  | ||||||
| screen_redraw_status(struct client *c) |  | ||||||
| { |  | ||||||
| 	tty_draw_line(&c->tty, &c->status, 0, 0, c->tty.sy - 1); |  | ||||||
| } |  | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								server.c
									
									
									
									
									
								
							| @@ -557,7 +557,7 @@ server_check_redraw(struct client *c) | |||||||
| 		if (server_locked) | 		if (server_locked) | ||||||
| 			server_redraw_locked(c); | 			server_redraw_locked(c); | ||||||
| 		else | 		else | ||||||
|  			screen_redraw_screen(c); |  			screen_redraw_screen(c, 0); | ||||||
| 		c->flags &= ~CLIENT_STATUS; | 		c->flags &= ~CLIENT_STATUS; | ||||||
| 	} else { | 	} else { | ||||||
| 		TAILQ_FOREACH(wp, &c->session->curw->window->panes, entry) { | 		TAILQ_FOREACH(wp, &c->session->curw->window->panes, entry) { | ||||||
| @@ -567,7 +567,7 @@ server_check_redraw(struct client *c) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (c->flags & CLIENT_STATUS) | 	if (c->flags & CLIENT_STATUS) | ||||||
| 		screen_redraw_status(c); | 		screen_redraw_screen(c, 1); | ||||||
|  |  | ||||||
| 	c->tty.flags |= flags; | 	c->tty.flags |= flags; | ||||||
|  |  | ||||||
| @@ -598,7 +598,7 @@ server_redraw_locked(struct client *c) | |||||||
|  |  | ||||||
| 	for (i = 0; i < screen_size_y(&screen); i++) | 	for (i = 0; i < screen_size_y(&screen); i++) | ||||||
| 		tty_draw_line(&c->tty, &screen, i, 0, 0); | 		tty_draw_line(&c->tty, &screen, i, 0, 0); | ||||||
| 	screen_redraw_status(c); | 	screen_redraw_screen(c, 1); | ||||||
|  |  | ||||||
| 	screen_free(&screen); | 	screen_free(&screen); | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								status.c
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								status.c
									
									
									
									
									
								
							| @@ -44,24 +44,27 @@ status_redraw(struct client *c) | |||||||
| 	struct screen_write_ctx		ctx; | 	struct screen_write_ctx		ctx; | ||||||
| 	struct session		       *s = c->session; | 	struct session		       *s = c->session; | ||||||
| 	struct winlink		       *wl; | 	struct winlink		       *wl; | ||||||
| 	struct window_pane	       *wp; | 	struct screen		      	old_status; | ||||||
| 	struct screen		       *sc = NULL, old_status; |  | ||||||
| 	char		 	       *left, *right, *text, *ptr; | 	char		 	       *left, *right, *text, *ptr; | ||||||
| 	size_t				llen, llen2, rlen, rlen2, offset; | 	size_t				llen, llen2, rlen, rlen2, offset; | ||||||
| 	size_t				xx, yy, sy, size, start, width; | 	size_t				xx, yy, size, start, width; | ||||||
| 	struct grid_cell	        stdgc, gc; | 	struct grid_cell	        stdgc, gc; | ||||||
| 	int				larrow, rarrow, utf8flag; | 	int				larrow, rarrow, utf8flag; | ||||||
|  |  | ||||||
| 	left = right = NULL; | 	left = right = NULL; | ||||||
|  |  | ||||||
|  | 	/* No status line?*/ | ||||||
|  | 	if (c->tty.sy == 0 || !options_get_number(&s->options, "status")) | ||||||
|  | 		return (1); | ||||||
|  | 	larrow = rarrow = 0; | ||||||
|  |  | ||||||
| 	/* Create the target screen. */ | 	/* Create the target screen. */ | ||||||
| 	memcpy(&old_status, &c->status, sizeof old_status); | 	memcpy(&old_status, &c->status, sizeof old_status); | ||||||
| 	screen_init(&c->status, c->tty.sx, 1, 0); | 	screen_init(&c->status, c->tty.sx, 1, 0); | ||||||
|  |  | ||||||
| 	/* No status line? */ | 	/* Create the target screen. */ | ||||||
| 	if (c->tty.sy == 0 || !options_get_number(&s->options, "status")) | 	memcpy(&old_status, &c->status, sizeof old_status); | ||||||
| 		goto off; | 	screen_init(&c->status, c->tty.sx, 1, 0); | ||||||
| 	larrow = rarrow = 0; |  | ||||||
|  |  | ||||||
| 	if (gettimeofday(&c->status_timer, NULL) != 0) | 	if (gettimeofday(&c->status_timer, NULL) != 0) | ||||||
| 		fatal("gettimeofday"); | 		fatal("gettimeofday"); | ||||||
| @@ -259,32 +262,6 @@ blank: | |||||||
| 	for (offset = 0; offset < c->tty.sx; offset++) | 	for (offset = 0; offset < c->tty.sx; offset++) | ||||||
| 		screen_write_putc(&ctx, &stdgc, ' '); | 		screen_write_putc(&ctx, &stdgc, ' '); | ||||||
|  |  | ||||||
| 	goto out; |  | ||||||
|  |  | ||||||
| off: |  | ||||||
| 	/* |  | ||||||
| 	 * Draw the real window last line. Necessary to wipe over message if |  | ||||||
| 	 * status is off. Not sure this is the right place for this. |  | ||||||
| 	 */ |  | ||||||
| 	memcpy(&stdgc, &grid_default_cell, sizeof stdgc); |  | ||||||
| 	screen_write_start(&ctx, NULL, &c->status); |  | ||||||
|  |  | ||||||
| 	sy = 0; |  | ||||||
| 	TAILQ_FOREACH(wp, &s->curw->window->panes, entry) { |  | ||||||
| 		sy += wp->sy + 1; |  | ||||||
| 		sc = wp->screen; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	screen_write_cursormove(&ctx, 0, 0); |  | ||||||
| 	if (sy < c->tty.sy) { |  | ||||||
| 		/* If the screen is too small, use blank. */ |  | ||||||
|  		for (offset = 0; offset < c->tty.sx; offset++) |  | ||||||
|  			screen_write_putc(&ctx, &stdgc, ' '); |  | ||||||
| 	} else { |  | ||||||
| 		screen_write_copy(&ctx, |  | ||||||
| 		    sc, 0, sc->grid->hsize + screen_size_y(sc) - 1, c->tty.sx, 1); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| out: | out: | ||||||
| 	screen_write_stop(&ctx); | 	screen_write_stop(&ctx); | ||||||
|  |  | ||||||
| @@ -518,6 +495,8 @@ status_message_clear(struct client *c) | |||||||
|  |  | ||||||
| 	c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); | 	c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); | ||||||
| 	c->flags |= CLIENT_REDRAW; | 	c->flags |= CLIENT_REDRAW; | ||||||
|  |  | ||||||
|  | 	screen_reinit(&c->status); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Draw client message on status line of present else on last line. */ | /* Draw client message on status line of present else on last line. */ | ||||||
| @@ -603,6 +582,8 @@ status_prompt_clear(struct client *c) | |||||||
|  |  | ||||||
| 	c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); | 	c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); | ||||||
| 	c->flags |= CLIENT_REDRAW; | 	c->flags |= CLIENT_REDRAW; | ||||||
|  |  | ||||||
|  | 	screen_reinit(&c->status); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Draw client prompt on status line of present else on last line. */ | /* Draw client prompt on status line of present else on last line. */ | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1395,9 +1395,8 @@ void	 screen_write_cell( | |||||||
|     	     struct screen_write_ctx *, const struct grid_cell *, u_char *); |     	     struct screen_write_ctx *, const struct grid_cell *, u_char *); | ||||||
|  |  | ||||||
| /* screen-redraw.c */ | /* screen-redraw.c */ | ||||||
| void	 screen_redraw_screen(struct client *); | void	 screen_redraw_screen(struct client *, int); | ||||||
| void	 screen_redraw_pane(struct client *, struct window_pane *); | void	 screen_redraw_pane(struct client *, struct window_pane *); | ||||||
| void	 screen_redraw_status(struct client *); |  | ||||||
|  |  | ||||||
| /* screen.c */ | /* screen.c */ | ||||||
| void	 screen_init(struct screen *, u_int, u_int, u_int); | void	 screen_init(struct screen *, u_int, u_int, u_int); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nicholas Marriott
					Nicholas Marriott