aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-22 01:21:35 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-22 01:47:13 -0400
commit864caa2f02053234012af0214cc49803e539f7eb (patch)
treed9127728aade69a3ebf4281ce9200a8b69164b98
parent811c7ebac662d1acc8b1b614c76b74c6043a48a0 (diff)
downloadrunes-864caa2f02053234012af0214cc49803e539f7eb.tar.gz
runes-864caa2f02053234012af0214cc49803e539f7eb.zip
fix insert lines implementation
-rw-r--r--src/display.c66
-rw-r--r--src/display.h2
-rw-r--r--src/parser.c4
-rw-r--r--src/parser.l4
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)