From 72d56bd6140a0101c04f48da6633ff93708b731d Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 15 Jul 2009 17:43:45 +0000 Subject: [PATCH] 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. --- screen-redraw.c | 56 +++++++++++++++++++++++++++++++------------------ server.c | 8 +++---- status.c | 49 +++++++++++++------------------------------ tmux.h | 5 ++--- 4 files changed, 57 insertions(+), 61 deletions(-) diff --git a/screen-redraw.c b/screen-redraw.c index 79f3e9c4..0abd6137 100644 --- a/screen-redraw.c +++ b/screen-redraw.c @@ -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 @@ -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,7 +75,16 @@ screen_redraw_screen(struct client *c) u_char choriz, cvert, cbackg; /* 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. */ if (tty_term_has(tty->term, TTYC_ACSC)) { @@ -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) { - tty_cursor(tty, wp->xoff, wp->yoff - 1, 0, 0); - for (i = 0; i < sx; i++) - tty_putc(tty, choriz); + 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) { - tty_cursor(tty, wp->xoff, wp->yoff + sy, 0, 0); - for (i = 0; i < sx; i++) - tty_putc(tty, choriz); + 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); -} diff --git a/server.c b/server.c index fee656fd..3d3d6f40 100644 --- a/server.c +++ b/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 @@ -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); } diff --git a/status.c b/status.c index 29c30067..59a32e6f 100644 --- a/status.c +++ b/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 @@ -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. */ diff --git a/tmux.h b/tmux.h index 94a41614..c15b1ad7 100644 --- a/tmux.h +++ b/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 @@ -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);