From 612403d9ff2e3e6c478a0b45f59847c19f0e00d2 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 2 May 2014 19:52:21 -0400 Subject: avoid redrawing when we haven't touched the screen --- src/display.c | 6 ++++++ src/screen.c | 28 ++++++++++++++++++++++++++++ src/screen.h | 2 ++ 3 files changed, 36 insertions(+) diff --git a/src/display.c b/src/display.c index a8c24bf..cc56202 100644 --- a/src/display.c +++ b/src/display.c @@ -86,6 +86,10 @@ void runes_display_draw_screen(RunesTerm *t) { int r; + if (!t->scr.dirty) { + return; + } + /* XXX quite inefficient */ for (r = 0; r < t->scr.max.row; ++r) { int c = 0; @@ -95,6 +99,8 @@ void runes_display_draw_screen(RunesTerm *t) } } runes_window_backend_request_flush(t); + + t->scr.dirty = 0; } void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr) diff --git a/src/screen.c b/src/screen.c index 24fff8e..36d3041 100644 --- a/src/screen.c +++ b/src/screen.c @@ -121,6 +121,8 @@ void runes_screen_show_string_ascii(RunesTerm *t, char *buf, size_t len) runes_screen_move_to(t, scr->cur.row, scr->cur.col + 1); } + + scr->dirty = 1; } void runes_screen_show_string_utf8(RunesTerm *t, char *buf, size_t len) @@ -188,6 +190,8 @@ void runes_screen_show_string_utf8(RunesTerm *t, char *buf, size_t len) break; } } + + scr->dirty = 1; } void runes_screen_move_to(RunesTerm *t, int row, int col) @@ -239,6 +243,8 @@ void runes_screen_clear_screen(RunesTerm *t) scr->rows[r].cells, 0, scr->max.col * sizeof(struct runes_cell)); scr->rows[r].wrapped = 0; } + + scr->dirty = 1; } void runes_screen_clear_screen_forward(RunesTerm *t) @@ -255,6 +261,8 @@ void runes_screen_clear_screen_forward(RunesTerm *t) scr->rows[r].cells, 0, scr->max.col * sizeof(struct runes_cell)); scr->rows[r].wrapped = 0; } + + scr->dirty = 1; } void runes_screen_clear_screen_backward(RunesTerm *t) @@ -270,6 +278,8 @@ void runes_screen_clear_screen_backward(RunesTerm *t) memset( scr->rows[scr->cur.row].cells, 0, scr->cur.col * sizeof(struct runes_cell)); + + scr->dirty = 1; } void runes_screen_kill_line(RunesTerm *t) @@ -280,6 +290,8 @@ void runes_screen_kill_line(RunesTerm *t) scr->rows[scr->cur.row].cells, 0, scr->max.col * sizeof(struct runes_cell)); scr->rows[scr->cur.row].wrapped = 0; + + scr->dirty = 1; } void runes_screen_kill_line_forward(RunesTerm *t) @@ -290,6 +302,8 @@ void runes_screen_kill_line_forward(RunesTerm *t) &scr->rows[scr->cur.row].cells[scr->cur.col], 0, (scr->max.col - scr->cur.col) * sizeof(struct runes_cell)); scr->rows[scr->cur.row].wrapped = 0; + + scr->dirty = 1; } void runes_screen_kill_line_backward(RunesTerm *t) @@ -302,6 +316,8 @@ void runes_screen_kill_line_backward(RunesTerm *t) if (scr->cur.row > 0) { scr->rows[scr->cur.row - 1].wrapped = 0; } + + scr->dirty = 1; } void runes_screen_insert_characters(RunesTerm *t, int count) @@ -321,6 +337,8 @@ void runes_screen_insert_characters(RunesTerm *t, int count) count * sizeof(struct runes_cell)); scr->rows[scr->cur.row].wrapped = 0; } + + scr->dirty = 1; } void runes_screen_insert_lines(RunesTerm *t, int count) @@ -349,6 +367,8 @@ void runes_screen_insert_lines(RunesTerm *t, int count) scr->rows[i].wrapped = 0; } } + + scr->dirty = 1; } void runes_screen_delete_characters(RunesTerm *t, int count) @@ -368,6 +388,8 @@ void runes_screen_delete_characters(RunesTerm *t, int count) count * sizeof(struct runes_cell)); scr->rows[scr->cur.row].wrapped = 0; } + + scr->dirty = 1; } void runes_screen_delete_lines(RunesTerm *t, int count) @@ -396,6 +418,8 @@ void runes_screen_delete_lines(RunesTerm *t, int count) scr->rows[i].wrapped = 0; } } + + scr->dirty = 1; } void runes_screen_set_scroll_region( @@ -551,6 +575,8 @@ void runes_screen_use_alternate_buffer(RunesTerm *t) scr->rows[i].cells = calloc( scr->max.col, sizeof(struct runes_cell)); } + + scr->dirty = 1; } void runes_screen_use_normal_buffer(RunesTerm *t) @@ -573,6 +599,8 @@ void runes_screen_use_normal_buffer(RunesTerm *t) runes_screen_restore_cursor(t); runes_screen_set_window_size(t); + + scr->dirty = 1; } void runes_screen_save_cursor(RunesTerm *t) diff --git a/src/screen.h b/src/screen.h index 3296764..6c1d353 100644 --- a/src/screen.h +++ b/src/screen.h @@ -86,6 +86,8 @@ struct runes_screen { unsigned char audible_bell: 1; unsigned char update_title: 1; unsigned char update_icon_name: 1; + + unsigned char dirty: 1; }; void runes_screen_init(RunesTerm *t); -- cgit v1.2.3-54-g00ecf