aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-05-02 19:52:21 -0400
committerJesse Luehrs <doy@tozt.net>2014-05-02 19:55:58 -0400
commit612403d9ff2e3e6c478a0b45f59847c19f0e00d2 (patch)
tree0a6babf1c572ffcda4ad4ffe79576d2f0d4faba7
parent250cc3d1e571cbb71119f8c2193f23be444b0c71 (diff)
downloadrunes-612403d9ff2e3e6c478a0b45f59847c19f0e00d2.tar.gz
runes-612403d9ff2e3e6c478a0b45f59847c19f0e00d2.zip
avoid redrawing when we haven't touched the screen
-rw-r--r--src/display.c6
-rw-r--r--src/screen.c28
-rw-r--r--src/screen.h2
3 files changed, 36 insertions, 0 deletions
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);