From 864caa2f02053234012af0214cc49803e539f7eb Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 22 Apr 2014 01:21:35 -0400 Subject: fix insert lines implementation --- src/display.c | 66 +++++++++++++++++++++++++++++++++++++++-------------------- src/display.h | 2 +- src/parser.c | 4 ++-- src/parser.l | 4 ++-- 4 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/display.c b/src/display.c index cd99045..0b57c3c 100644 --- a/src/display.c +++ b/src/display.c @@ -11,6 +11,7 @@ static void runes_display_position_cursor(RunesTerm *t, cairo_t *cr); static void runes_display_paint_rectangle( RunesTerm *t, cairo_t *cr, cairo_pattern_t *pattern, int x, int y, int width, int height); +static void runes_display_scroll_up(RunesTerm *t, int rows); static void runes_display_scroll_down(RunesTerm *t, int rows); void runes_display_init(RunesTerm *t) @@ -228,6 +229,27 @@ void runes_display_kill_line_backward(RunesTerm *t) t, t->cr, t->bgdefault, 0, t->row, t->col, 1); } +void runes_display_insert_lines(RunesTerm *t, int count) +{ + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + + cairo_save(t->cr); + cairo_push_group(t->cr); + pattern = cairo_pattern_create_for_surface(cairo_get_target(t->cr)); + cairo_matrix_init_translate(&matrix, 0.0, -count * t->fonty); + cairo_pattern_set_matrix(pattern, &matrix); + runes_display_paint_rectangle( + t, t->cr, pattern, + 0, t->row + count, t->cols, t->rows - t->row - count); + cairo_pattern_destroy(pattern); + cairo_pop_group_to_source(t->cr); + cairo_paint(t->cr); + runes_display_paint_rectangle( + t, t->cr, t->bgdefault, 0, t->row, t->cols, count); + cairo_restore(t->cr); +} + void runes_display_insert_characters(RunesTerm *t, int count) { cairo_pattern_t *pattern; @@ -490,28 +512,6 @@ void runes_display_set_scroll_region( runes_display_move_to(t, t->scroll_top, 0); } -void runes_display_scroll_up(RunesTerm *t, int rows) -{ - cairo_pattern_t *pattern; - cairo_matrix_t matrix; - - cairo_save(t->cr); - cairo_push_group(t->cr); - pattern = cairo_pattern_create_for_surface(cairo_get_target(t->cr)); - cairo_matrix_init_translate(&matrix, 0.0, -rows * t->fonty); - cairo_pattern_set_matrix(pattern, &matrix); - runes_display_paint_rectangle( - t, t->cr, pattern, - 0, t->scroll_top + rows, - t->cols, t->scroll_bottom - t->scroll_top + 1 - rows); - cairo_pattern_destroy(pattern); - cairo_pop_group_to_source(t->cr); - cairo_paint(t->cr); - runes_display_paint_rectangle( - t, t->cr, t->bgdefault, 0, t->scroll_top, t->cols, rows); - cairo_restore(t->cr); -} - void runes_display_cleanup(RunesTerm *t) { int i; @@ -622,6 +622,28 @@ static void runes_display_paint_rectangle( runes_display_position_cursor(t, t->cr); } +static void runes_display_scroll_up(RunesTerm *t, int rows) +{ + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + + cairo_save(t->cr); + cairo_push_group(t->cr); + pattern = cairo_pattern_create_for_surface(cairo_get_target(t->cr)); + cairo_matrix_init_translate(&matrix, 0.0, -rows * t->fonty); + cairo_pattern_set_matrix(pattern, &matrix); + runes_display_paint_rectangle( + t, t->cr, pattern, + 0, t->scroll_top + rows, + t->cols, t->scroll_bottom - t->scroll_top + 1 - rows); + cairo_pattern_destroy(pattern); + cairo_pop_group_to_source(t->cr); + cairo_paint(t->cr); + runes_display_paint_rectangle( + t, t->cr, t->bgdefault, 0, t->scroll_top, t->cols, rows); + cairo_restore(t->cr); +} + static void runes_display_scroll_down(RunesTerm *t, int rows) { cairo_pattern_t *pattern; diff --git a/src/display.h b/src/display.h index 3d28f95..74f3713 100644 --- a/src/display.h +++ b/src/display.h @@ -12,6 +12,7 @@ void runes_display_clear_screen(RunesTerm *t); void runes_display_clear_screen_forward(RunesTerm *t); void runes_display_kill_line_forward(RunesTerm *t); void runes_display_kill_line_backward(RunesTerm *t); +void runes_display_insert_lines(RunesTerm *t, int count); void runes_display_insert_characters(RunesTerm *t, int count); void runes_display_delete_lines(RunesTerm *t, int count); void runes_display_delete_characters(RunesTerm *t, int count); @@ -38,7 +39,6 @@ void runes_display_use_alternate_buffer(RunesTerm *t); void runes_display_use_normal_buffer(RunesTerm *t); void runes_display_set_scroll_region( RunesTerm *t, int top, int bottom, int left, int right); -void runes_display_scroll_up(RunesTerm *t, int rows); void runes_display_cleanup(RunesTerm *t); #endif diff --git a/src/parser.c b/src/parser.c index 5b4888f..8ea5e8e 100644 --- a/src/parser.c +++ b/src/parser.c @@ -2604,8 +2604,8 @@ static void runes_parser_handle_il(RunesTerm *t, char *buf, size_t len) int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); - /* XXX this is wrong - it only works if the cursor is on the top line */ - runes_display_scroll_up(t, params[0]); + runes_display_insert_lines(t, params[0]); + runes_display_move_to(t, t->row, 0); } static void runes_parser_handle_dl(RunesTerm *t, char *buf, size_t len) diff --git a/src/parser.l b/src/parser.l index 6141f17..0fe5d06 100644 --- a/src/parser.l +++ b/src/parser.l @@ -474,8 +474,8 @@ static void runes_parser_handle_il(RunesTerm *t, char *buf, size_t len) int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams; runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams); - /* XXX this is wrong - it only works if the cursor is on the top line */ - runes_display_scroll_up(t, params[0]); + runes_display_insert_lines(t, params[0]); + runes_display_move_to(t, t->row, 0); } static void runes_parser_handle_dl(RunesTerm *t, char *buf, size_t len) -- cgit v1.2.3-54-g00ecf