From d5922b3f25287cb826fe166485c446de94400ce2 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 14 Apr 2014 18:50:43 -0400 Subject: implement the alternate screen buffer --- display.c | 33 +++++++++++++++++++++++++++++++++ display.h | 2 ++ parser.c | 6 ++++++ parser.l | 6 ++++++ term.h | 2 ++ 5 files changed, 49 insertions(+) diff --git a/display.c b/display.c index bdf0c77..ce3cec8 100644 --- a/display.c +++ b/display.c @@ -12,6 +12,7 @@ void runes_display_init(RunesTerm *t) runes_window_backend_get_size(t, &x, &y); t->cr = NULL; + t->alternate_cr = NULL; t->colors[0] = cairo_pattern_create_rgb(0.0, 0.0, 0.0); t->colors[1] = cairo_pattern_create_rgb(1.0, 0.0, 0.0); @@ -331,6 +332,38 @@ void runes_display_restore_cursor(RunesTerm *t) t->col = t->saved_col; } +void runes_display_use_alternate_buffer(RunesTerm *t) +{ + int x, y; + + if (t->alternate) { + return; + } + + runes_display_save_cursor(t); + t->alternate = 1; + t->alternate_cr = t->cr; + t->cr = NULL; + x = t->xpixel; + y = t->ypixel; + t->xpixel = -1; + t->ypixel = -1; + runes_display_set_window_size(t, x, y); +} + +void runes_display_use_normal_buffer(RunesTerm *t) +{ + if (!t->alternate) { + return; + } + + runes_display_restore_cursor(t); + t->alternate = 0; + cairo_destroy(t->cr); + t->cr = t->alternate_cr; + t->alternate_cr = NULL; +} + static cairo_scaled_font_t *runes_display_make_font(RunesTerm *t) { cairo_font_face_t *font_face; diff --git a/display.h b/display.h index 4efddef..fa989c5 100644 --- a/display.h +++ b/display.h @@ -29,5 +29,7 @@ void runes_display_hide_cursor(RunesTerm *t); void runes_display_visual_bell(RunesTerm *t); void runes_display_save_cursor(RunesTerm *t); void runes_display_restore_cursor(RunesTerm *t); +void runes_display_use_alternate_buffer(RunesTerm *t); +void runes_display_use_normal_buffer(RunesTerm *t); #endif diff --git a/parser.c b/parser.c index 55e7482..ef95462 100644 --- a/parser.c +++ b/parser.c @@ -2330,6 +2330,9 @@ static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len) case 25: runes_display_show_cursor(t); break; + case 1049: + runes_display_use_alternate_buffer(t); + break; default: fprintf( stderr, "unknown SM parameter: %c%d\n", @@ -2359,6 +2362,9 @@ static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len) case 25: runes_display_hide_cursor(t); break; + case 1049: + runes_display_use_normal_buffer(t); + break; default: fprintf( stderr, "unknown RM parameter: %c%d\n", diff --git a/parser.l b/parser.l index 0fb8c1d..2bf7206 100644 --- a/parser.l +++ b/parser.l @@ -359,6 +359,9 @@ static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len) case 25: runes_display_show_cursor(t); break; + case 1049: + runes_display_use_alternate_buffer(t); + break; default: fprintf( stderr, "unknown SM parameter: %c%d\n", @@ -388,6 +391,9 @@ static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len) case 25: runes_display_hide_cursor(t); break; + case 1049: + runes_display_use_normal_buffer(t); + break; default: fprintf( stderr, "unknown RM parameter: %c%d\n", diff --git a/term.h b/term.h index 4813097..6bcc07c 100644 --- a/term.h +++ b/term.h @@ -7,6 +7,7 @@ struct runes_term { cairo_t *cr; cairo_t *backend_cr; + cairo_t *alternate_cr; uv_loop_t *loop; cairo_pattern_t *bgcolor; @@ -21,6 +22,7 @@ struct runes_term { char show_cursor; char focused; + char alternate; cairo_pattern_t *colors[8]; -- cgit v1.2.3-54-g00ecf