From c55dd7f8ddf70d45fac028050fef94b1638c402b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 25 Apr 2014 01:46:23 -0400 Subject: implement the alternate screen --- src/screen.c | 46 ++++++++++++++++++++++++++++++++++++++-------- src/screen.h | 1 + 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; -- cgit v1.2.3-54-g00ecf