aboutsummaryrefslogtreecommitdiffstats
path: root/display.c
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-14 19:44:41 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-14 19:44:41 -0400
commit27d4720d7861be2fcc1c35ad4b6fd7a8741d31f6 (patch)
tree5b229785d23f929dd0ee21d54536e0559d8e312b /display.c
parent5250854f859b516712e6990d7a9a31bceefaad9e (diff)
downloadrunes-27d4720d7861be2fcc1c35ad4b6fd7a8741d31f6.tar.gz
runes-27d4720d7861be2fcc1c35ad4b6fd7a8741d31f6.zip
implement text scrolling off the bottom of the screen
Diffstat (limited to 'display.c')
-rw-r--r--display.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/display.c b/display.c
index ce3cec8..7cd502d 100644
--- a/display.c
+++ b/display.c
@@ -3,6 +3,7 @@
#include "runes.h"
static cairo_scaled_font_t *runes_display_make_font(RunesTerm *t);
+static void runes_display_scroll_down(RunesTerm *t, int rows);
void runes_display_init(RunesTerm *t)
{
@@ -144,13 +145,19 @@ void runes_display_focus_out(RunesTerm *t)
void runes_display_move_to(RunesTerm *t, int row, int col)
{
double fontx, fonty, ascent;
+ int scroll = row - t->rows + 1;
t->row = row;
t->col = col;
runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
- cairo_move_to(t->cr, col * fontx, row * fonty + ascent);
+ if (scroll > 0) {
+ runes_display_scroll_down(t, scroll);
+ t->row = t->rows - 1;
+ }
+
+ cairo_move_to(t->cr, t->col * fontx, t->row * fonty + ascent);
}
void runes_display_show_string(RunesTerm *t, char *buf, size_t len)
@@ -378,3 +385,20 @@ static cairo_scaled_font_t *runes_display_make_font(RunesTerm *t)
return cairo_scaled_font_create(
font_face, &font_matrix, &ctm, cairo_font_options_create());
}
+
+static void runes_display_scroll_down(RunesTerm *t, int rows)
+{
+ double fontx, fonty, ascent;
+
+ runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
+
+ cairo_save(t->cr);
+ cairo_set_source_surface(
+ t->cr, cairo_get_target(t->cr), 0.0, -rows * fonty);
+ cairo_paint(t->cr);
+ cairo_set_source(t->cr, t->colors[0]);
+ cairo_rectangle(
+ t->cr, 0.0, t->ypixel - rows * fonty, t->xpixel, rows * fonty);
+ cairo_fill(t->cr);
+ cairo_restore(t->cr);
+}