From 62d7ad2690c0f72f06195351aa50e3fe037f456a Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sat, 14 Jun 2008 12:05:06 +0000 Subject: [PATCH] Clear blank area properly on redraw, and add a marker line below it. --- resize.c | 11 ++--------- screen-redraw.c | 14 +------------- screen.c | 9 ++------- server.c | 34 +++++++++++++++++++++++++--------- tmux.h | 3 +-- 5 files changed, 31 insertions(+), 40 deletions(-) diff --git a/resize.c b/resize.c index 22011d2b..2a7db335 100644 --- a/resize.c +++ b/resize.c @@ -1,4 +1,4 @@ -/* $Id: resize.c,v 1.13 2008-06-07 07:13:08 nicm Exp $ */ +/* $Id: resize.c,v 1.14 2008-06-14 12:05:06 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -122,13 +122,6 @@ recalculate_sizes(void) screen_size_x(&w->base), screen_size_y(&w->base)); window_resize(w, ssx, ssy); - - for (i = 0; i < ARRAY_LENGTH(&clients); i++) { - c = ARRAY_ITEM(&clients, i); - if (c == NULL || c->session == NULL) - continue; - if (c->session->curw->window == w) - c->flags |= (CLIENT_CLEAR|CLIENT_REDRAW); - } + server_redraw_window(w); } } diff --git a/screen-redraw.c b/screen-redraw.c index ceb75ec4..6d6f328e 100644 --- a/screen-redraw.c +++ b/screen-redraw.c @@ -1,4 +1,4 @@ -/* $Id: screen-redraw.c,v 1.4 2008-01-03 21:32:11 nicm Exp $ */ +/* $Id: screen-redraw.c,v 1.5 2008-06-14 12:05:06 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -149,18 +149,6 @@ screen_redraw_write_string(struct screen_redraw_ctx *ctx, const char *fmt, ...) xfree(msg); } -/* Clear screen. */ -void -screen_redraw_clear_screen(struct screen_redraw_ctx *ctx) -{ - u_int i; - - for (i = 0; i < screen_size_y(ctx->s); i++) { - screen_redraw_move_cursor(ctx, 0, i); - ctx->write(ctx->data, TTY_CLEARLINE); - } -} - /* Redraw single cell. */ void screen_redraw_cell(struct screen_redraw_ctx *ctx, u_int px, u_int py) diff --git a/screen.c b/screen.c index 45ece4b7..51b8fa2d 100644 --- a/screen.c +++ b/screen.c @@ -1,4 +1,4 @@ -/* $Id: screen.c,v 1.60 2008-06-03 21:42:37 nicm Exp $ */ +/* $Id: screen.c,v 1.61 2008-06-14 12:05:06 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -297,13 +297,8 @@ void screen_set_cell(struct screen *s, u_int cx, u_int cy, u_char data, u_char attr, u_char colr) { - if (cx >= s->grid_size[cy]) { - if (data == SCREEN_DEFDATA && - attr == SCREEN_DEFATTR && - colr == SCREEN_DEFCOLR) - return; + if (cx >= s->grid_size[cy]) screen_expand_line(s, cy, cx + 1); - } s->grid_data[cy][cx] = data; s->grid_attr[cy][cx] = attr; diff --git a/server.c b/server.c index 04b04915..2f9a9b0c 100644 --- a/server.c +++ b/server.c @@ -1,4 +1,4 @@ -/* $Id: server.c,v 1.61 2008-06-08 19:49:04 nicm Exp $ */ +/* $Id: server.c,v 1.62 2008-06-14 12:05:06 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -302,19 +302,35 @@ server_check_redraw(struct client *c) { struct screen_redraw_ctx ctx; struct screen screen; + u_int xx, yy, sx, sy; if (c == NULL || c->session == NULL) return; - if (c->flags & CLIENT_CLEAR) { - screen_create(&screen, c->sx, c->sy - 1, 0); - screen_redraw_start(&ctx, &screen, tty_write_client, c); - screen_redraw_clear_screen(&ctx); - screen_redraw_stop(&ctx); - screen_destroy(&screen); - } - + xx = c->sx; + yy = c->sy - options_get_number(&global_options, "status-lines"); if (c->flags & CLIENT_REDRAW) { + sx = screen_size_x(c->session->curw->window->screen); + sy = screen_size_y(c->session->curw->window->screen); + if (sy < yy) { + /* + * Fake up a blank(ish) screen and use it. NOTE: because + * this uses tty_write_client but doesn't write the + * client's screen, this can't use anything which + * relies on cursor position. This is icky and might + * break if we try to optimise redrawing later :-/. + */ + screen_create(&screen, xx, yy, 0); + screen_fill_area(&screen, 0, 0, xx, yy, ' ', 0, 0x70); + screen_fill_area(&screen, 0, sy, sx, 1, '-', 0, 0x70); + + screen_redraw_start(&ctx, &screen, tty_write_client, c); + screen_redraw_lines(&ctx, sy, yy - sy); + screen_redraw_stop(&ctx); + + screen_destroy(&screen); + } + screen_redraw_start_client(&ctx, c); screen_redraw_lines(&ctx, 0, screen_size_y(ctx.s)); screen_redraw_stop(&ctx); diff --git a/tmux.h b/tmux.h index 84e0b14e..78697eee 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.139 2008-06-07 07:27:28 nicm Exp $ */ +/* $Id: tmux.h,v 1.140 2008-06-14 12:05:06 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1001,7 +1001,6 @@ void screen_redraw_move_cursor(struct screen_redraw_ctx *, u_int, u_int); void screen_redraw_set_attributes(struct screen_redraw_ctx *, u_int, u_int); void printflike2 screen_redraw_write_string( struct screen_redraw_ctx *, const char *, ...); -void screen_redraw_clear_screen(struct screen_redraw_ctx *); void screen_redraw_cell(struct screen_redraw_ctx *, u_int, u_int); void screen_redraw_area( struct screen_redraw_ctx *, u_int, u_int, u_int, u_int);