aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-14 18:50:43 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-14 18:50:43 -0400
commitd5922b3f25287cb826fe166485c446de94400ce2 (patch)
tree5d3603b31cbfe083c191cc31f42d290a98a004f8
parentd13254ad9b7c5d45e8d5092d28b31441606fe5bf (diff)
downloadrunes-d5922b3f25287cb826fe166485c446de94400ce2.tar.gz
runes-d5922b3f25287cb826fe166485c446de94400ce2.zip
implement the alternate screen buffer
-rw-r--r--display.c33
-rw-r--r--display.h2
-rw-r--r--parser.c6
-rw-r--r--parser.l6
-rw-r--r--term.h2
5 files changed, 49 insertions, 0 deletions
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];