diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-04-14 18:50:43 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-04-14 18:50:43 -0400 |
commit | d5922b3f25287cb826fe166485c446de94400ce2 (patch) | |
tree | 5d3603b31cbfe083c191cc31f42d290a98a004f8 | |
parent | d13254ad9b7c5d45e8d5092d28b31441606fe5bf (diff) | |
download | runes-d5922b3f25287cb826fe166485c446de94400ce2.tar.gz runes-d5922b3f25287cb826fe166485c446de94400ce2.zip |
implement the alternate screen buffer
-rw-r--r-- | display.c | 33 | ||||
-rw-r--r-- | display.h | 2 | ||||
-rw-r--r-- | parser.c | 6 | ||||
-rw-r--r-- | parser.l | 6 | ||||
-rw-r--r-- | term.h | 2 |
5 files changed, 49 insertions, 0 deletions
@@ -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; @@ -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 @@ -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", @@ -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", @@ -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]; |