mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +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 commit is contained in:
		@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: screen-redraw.c,v 1.39 2009-07-15 17:42:44 nicm Exp $ */
 | 
			
		||||
/* $Id: screen-redraw.c,v 1.40 2009-07-15 17:43:45 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -63,9 +63,9 @@ screen_redraw_check_cell(struct client *c, u_int px, u_int py)
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Redraw entire screen.. */
 | 
			
		||||
/* Redraw entire screen. */
 | 
			
		||||
void
 | 
			
		||||
screen_redraw_screen(struct client *c)
 | 
			
		||||
screen_redraw_screen(struct client *c, int status_only)
 | 
			
		||||
{
 | 
			
		||||
	struct window		*w = c->session->curw->window;
 | 
			
		||||
	struct tty		*tty = &c->tty;
 | 
			
		||||
@@ -75,8 +75,17 @@ screen_redraw_screen(struct client *c)
 | 
			
		||||
	u_char			 choriz, cvert, cbackg;
 | 
			
		||||
 | 
			
		||||
	/* Get status line, er, 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. */
 | 
			
		||||
	if (tty_term_has(tty->term, TTYC_ACSC)) {
 | 
			
		||||
		has_acs = 1;
 | 
			
		||||
@@ -95,6 +104,8 @@ screen_redraw_screen(struct client *c)
 | 
			
		||||
	if (has_acs)
 | 
			
		||||
		tty_putcode(tty, TTYC_SMACS);
 | 
			
		||||
	for (j = 0; j < tty->sy - status; j++) {
 | 
			
		||||
		if (status_only && j != tty->sy - 1)
 | 
			
		||||
			continue;
 | 
			
		||||
		for (i = 0; i < tty->sx; i++) {
 | 
			
		||||
			if (!screen_redraw_check_cell(c, i, j)) {
 | 
			
		||||
				tty_cursor(tty, i, j, 0, 0);
 | 
			
		||||
@@ -120,12 +131,16 @@ screen_redraw_screen(struct client *c)
 | 
			
		||||
			tty_putcode(tty, TTYC_SMACS);
 | 
			
		||||
		if (wp->xoff > 0) {
 | 
			
		||||
			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_putc(tty, cvert);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (wp->xoff + sx < tty->sx) {
 | 
			
		||||
			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_putc(&c->tty, cvert);
 | 
			
		||||
			}
 | 
			
		||||
@@ -133,24 +148,33 @@ screen_redraw_screen(struct client *c)
 | 
			
		||||
 | 
			
		||||
		/* Draw top and bottom borders. */
 | 
			
		||||
		if (wp->yoff > 0) {
 | 
			
		||||
			if (!status_only || wp->yoff - 1 == tty->sy - 1) {
 | 
			
		||||
				tty_cursor(tty, wp->xoff, wp->yoff - 1, 0, 0);
 | 
			
		||||
				for (i = 0; i < sx; i++)
 | 
			
		||||
					tty_putc(tty, choriz);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (wp->yoff + sy < tty->sy - status) {
 | 
			
		||||
			if (!status_only || wp->yoff + sy == tty->sy - 1) {
 | 
			
		||||
				tty_cursor(tty, wp->xoff, wp->yoff + sy, 0, 0);
 | 
			
		||||
				for (i = 0; i < sx; i++)
 | 
			
		||||
					tty_putc(tty, choriz);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (has_acs)
 | 
			
		||||
			tty_putcode(tty, TTYC_RMACS);
 | 
			
		||||
 | 
			
		||||
		/* 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. */
 | 
			
		||||
	screen_redraw_status(c);
 | 
			
		||||
	if (status)
 | 
			
		||||
		tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 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++)
 | 
			
		||||
		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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								server.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: server.c,v 1.157 2009-07-14 06:39:25 nicm Exp $ */
 | 
			
		||||
/* $Id: server.c,v 1.158 2009-07-15 17:43:45 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -562,7 +562,7 @@ server_check_redraw(struct client *c)
 | 
			
		||||
		if (server_locked)
 | 
			
		||||
			server_redraw_locked(c);
 | 
			
		||||
		else
 | 
			
		||||
 			screen_redraw_screen(c);
 | 
			
		||||
 			screen_redraw_screen(c, 0);
 | 
			
		||||
		c->flags &= ~CLIENT_STATUS;
 | 
			
		||||
	} else {
 | 
			
		||||
		TAILQ_FOREACH(wp, &c->session->curw->window->panes, entry) {
 | 
			
		||||
@@ -572,7 +572,7 @@ server_check_redraw(struct client *c)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (c->flags & CLIENT_STATUS)
 | 
			
		||||
		screen_redraw_status(c);
 | 
			
		||||
		screen_redraw_screen(c, 1);
 | 
			
		||||
 | 
			
		||||
	c->tty.flags |= flags;
 | 
			
		||||
 | 
			
		||||
@@ -603,7 +603,7 @@ server_redraw_locked(struct client *c)
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < screen_size_y(&screen); i++)
 | 
			
		||||
		tty_draw_line(&c->tty, &screen, i, 0, 0);
 | 
			
		||||
	screen_redraw_status(c);
 | 
			
		||||
	screen_redraw_screen(c, 1);
 | 
			
		||||
 | 
			
		||||
	screen_free(&screen);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								status.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								status.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: status.c,v 1.91 2009-07-14 06:39:10 nicm Exp $ */
 | 
			
		||||
/* $Id: status.c,v 1.92 2009-07-15 17:43:45 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -44,24 +44,27 @@ status_redraw(struct client *c)
 | 
			
		||||
	struct screen_write_ctx		ctx;
 | 
			
		||||
	struct session		       *s = c->session;
 | 
			
		||||
	struct winlink		       *wl;
 | 
			
		||||
	struct window_pane	       *wp;
 | 
			
		||||
	struct screen		       *sc = NULL, old_status;
 | 
			
		||||
	struct screen		      	old_status;
 | 
			
		||||
	char		 	       *left, *right, *text, *ptr;
 | 
			
		||||
	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;
 | 
			
		||||
	int				larrow, rarrow, utf8flag;
 | 
			
		||||
 | 
			
		||||
	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. */
 | 
			
		||||
	memcpy(&old_status, &c->status, sizeof old_status);
 | 
			
		||||
	screen_init(&c->status, c->tty.sx, 1, 0);
 | 
			
		||||
 | 
			
		||||
	/* No status line? */
 | 
			
		||||
	if (c->tty.sy == 0 || !options_get_number(&s->options, "status"))
 | 
			
		||||
		goto off;
 | 
			
		||||
	larrow = rarrow = 0;
 | 
			
		||||
	/* Create the target screen. */
 | 
			
		||||
	memcpy(&old_status, &c->status, sizeof old_status);
 | 
			
		||||
	screen_init(&c->status, c->tty.sx, 1, 0);
 | 
			
		||||
 | 
			
		||||
	if (gettimeofday(&c->status_timer, NULL) != 0)
 | 
			
		||||
		fatal("gettimeofday");
 | 
			
		||||
@@ -259,32 +262,6 @@ blank:
 | 
			
		||||
	for (offset = 0; offset < c->tty.sx; offset++)
 | 
			
		||||
		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:
 | 
			
		||||
	screen_write_stop(&ctx);
 | 
			
		||||
 | 
			
		||||
@@ -518,6 +495,8 @@ status_message_clear(struct client *c)
 | 
			
		||||
 | 
			
		||||
	c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE);
 | 
			
		||||
	c->flags |= CLIENT_REDRAW;
 | 
			
		||||
 | 
			
		||||
	screen_reinit(&c->status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 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->flags |= CLIENT_REDRAW;
 | 
			
		||||
 | 
			
		||||
	screen_reinit(&c->status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Draw client prompt on status line of present else on last line. */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: tmux.h,v 1.362 2009-07-15 17:42:44 nicm Exp $ */
 | 
			
		||||
/* $Id: tmux.h,v 1.363 2009-07-15 17:43:45 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -1394,9 +1394,8 @@ void	 screen_write_cell(
 | 
			
		||||
    	     struct screen_write_ctx *, const struct grid_cell *, u_char *);
 | 
			
		||||
 | 
			
		||||
/* 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_status(struct client *);
 | 
			
		||||
 | 
			
		||||
/* screen.c */
 | 
			
		||||
void	 screen_init(struct screen *, u_int, u_int, u_int);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user