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.
pull/1/head
Nicholas Marriott 2009-07-15 17:43:45 +00:00
parent ad1945c278
commit 72d56bd614
4 changed files with 57 additions and 61 deletions

View File

@ -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> * 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); 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);
}

View File

@ -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> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -562,7 +562,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) {
@ -572,7 +572,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;
@ -603,7 +603,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);
} }

View File

@ -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> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -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. */

5
tmux.h
View File

@ -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> * 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 *); 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);