summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/screen-redraw.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-07-14 19:03:17 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-07-14 19:03:17 +0000
commit0c6165b31fe385fa5437282f84018142970ba133 (patch)
tree904b171ebc0f5884d936f379928f7ef3dcb69b34 /usr.bin/tmux/screen-redraw.c
parent8d749c48f10e597763969100bc994f7a091afdb1 (diff)
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.
Diffstat (limited to 'usr.bin/tmux/screen-redraw.c')
-rw-r--r--usr.bin/tmux/screen-redraw.c56
1 files changed, 36 insertions, 20 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);
-}