summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2009-07-14 19:03:16 +0000
committernicm <nicm@openbsd.org>2009-07-14 19:03:16 +0000
commit79fc95a87ae5334f2a00ab6b2e402242d29f56f6 (patch)
treec5d62584cc74dbbfd215fd96246f097cd904592a
parentSilence ``invalid NVRAM header'' message if the NVRAM header is three zero (diff)
downloadwireguard-openbsd-79fc95a87ae5334f2a00ab6b2e402242d29f56f6.tar.xz
wireguard-openbsd-79fc95a87ae5334f2a00ab6b2e402242d29f56f6.zip
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.
-rw-r--r--usr.bin/tmux/screen-redraw.c56
-rw-r--r--usr.bin/tmux/server.c8
-rw-r--r--usr.bin/tmux/status.c49
-rw-r--r--usr.bin/tmux/tmux.h5
4 files changed, 57 insertions, 61 deletions
diff --git a/usr.bin/tmux/screen-redraw.c b/usr.bin/tmux/screen-redraw.c
index 5d785e2e0b2..c44aa84c54f 100644
--- a/usr.bin/tmux/screen-redraw.c
+++ b/usr.bin/tmux/screen-redraw.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen-redraw.c,v 1.3 2009/07/14 07:23:36 nicm Exp $ */
+/* $OpenBSD: screen-redraw.c,v 1.4 2009/07/14 19:03:16 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,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/usr.bin/tmux/server.c b/usr.bin/tmux/server.c
index 761f32161ac..874291d2a05 100644
--- a/usr.bin/tmux/server.c
+++ b/usr.bin/tmux/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.8 2009/07/12 17:33:18 nicm Exp $ */
+/* $OpenBSD: server.c,v 1.9 2009/07/14 19:03:16 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -557,7 +557,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) {
@@ -567,7 +567,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;
@@ -598,7 +598,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/usr.bin/tmux/status.c b/usr.bin/tmux/status.c
index 6f6f5a2320d..844a1adadf8 100644
--- a/usr.bin/tmux/status.c
+++ b/usr.bin/tmux/status.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: status.c,v 1.6 2009/07/12 16:15:34 nicm Exp $ */
+/* $OpenBSD: status.c,v 1.7 2009/07/14 19:03:16 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. */
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 5449b2deaed..12b3c11168d 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.28 2009/07/14 07:23:36 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.29 2009/07/14 19:03:16 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1395,9 +1395,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);