aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-25 01:46:23 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-25 01:46:23 -0400
commitc55dd7f8ddf70d45fac028050fef94b1638c402b (patch)
tree47267c67a4e50632e1d64e1aa7f37f9a5f012ea5
parent95892504bf2fc1f9ce860b85e37277c320658407 (diff)
downloadrunes-c55dd7f8ddf70d45fac028050fef94b1638c402b.tar.gz
runes-c55dd7f8ddf70d45fac028050fef94b1638c402b.zip
implement the alternate screen
-rw-r--r--src/screen.c46
-rw-r--r--src/screen.h1
2 files changed, 39 insertions, 8 deletions
diff --git a/src/screen.c b/src/screen.c
index 810423e..4fde589 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -338,26 +338,56 @@ void runes_screen_reset_inverse(RunesTerm *t)
void runes_screen_use_alternate_buffer(RunesTerm *t)
{
- UNUSED(t);
- fprintf(stderr, "use_alternate_buffer nyi\n");
+ RunesScreen *scr = &t->scr;
+ int i;
+
+ if (scr->alternate) {
+ return;
+ }
+
+ runes_screen_save_cursor(t);
+
+ scr->alternate = scr->rows;
+
+ scr->rows = calloc(scr->max.row, sizeof(struct runes_row));
+ for (i = 0; i < scr->max.row; ++i) {
+ scr->rows[i].cells = calloc(
+ scr->max.col, sizeof(struct runes_cell));
+ }
}
void runes_screen_use_normal_buffer(RunesTerm *t)
{
- UNUSED(t);
- fprintf(stderr, "use_normal_buffer nyi\n");
+ RunesScreen *scr = &t->scr;
+ int i;
+
+ if (!scr->alternate) {
+ return;
+ }
+
+ for (i = 0; i < scr->max.row; ++i) {
+ free(scr->rows[i].cells);
+ }
+ free(scr->rows);
+
+ scr->rows = scr->alternate;
+ scr->alternate = NULL;
+
+ runes_screen_restore_cursor(t);
}
void runes_screen_save_cursor(RunesTerm *t)
{
- UNUSED(t);
- fprintf(stderr, "save_cursor nyi\n");
+ RunesScreen *scr = &t->scr;
+
+ scr->saved = scr->cur;
}
void runes_screen_restore_cursor(RunesTerm *t)
{
- UNUSED(t);
- fprintf(stderr, "restore_cursor nyi\n");
+ RunesScreen *scr = &t->scr;
+
+ scr->cur = scr->saved;
}
void runes_screen_show_cursor(RunesTerm *t)
diff --git a/src/screen.h b/src/screen.h
index c0cab3a..d0e8e8a 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -61,6 +61,7 @@ struct runes_screen {
char *icon_name;
struct runes_row *rows;
+ struct runes_row *alternate;
struct runes_cell_attrs attrs;