From f5fa40de813448b56910258d39e73255cdadfdfa Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 16 Nov 2016 20:19:31 +0530 Subject: [PATCH] More CSI handlers --- kitty/data-types.h | 5 +++++ kitty/parser.c | 24 +++++++++++++++++++++++- kitty/screen.c | 2 ++ kitty_tests/parser.py | 3 +++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/kitty/data-types.h b/kitty/data-types.h index 15d7286a2..a9582996e 100644 --- a/kitty/data-types.h +++ b/kitty/data-types.h @@ -299,6 +299,7 @@ void screen_restore_cursor(Screen *); void screen_save_cursor(Screen *); void screen_cursor_position(Screen*, unsigned int, unsigned int); void screen_cursor_back(Screen *self, unsigned int count/*=1*/, int move_direction/*=-1*/); +void screen_erase_in_line(Screen *, unsigned int, bool); void screen_erase_in_display(Screen *, unsigned int, bool); void screen_draw(Screen *screen, uint8_t *buf, unsigned int buflen); void screen_ensure_bounds(Screen *self, bool use_margins); @@ -320,6 +321,10 @@ void screen_cursor_down(Screen *self, unsigned int count/*=1*/); void screen_cursor_forward(Screen *self, unsigned int count/*=1*/); void screen_cursor_down1(Screen *self, unsigned int count/*=1*/); void screen_cursor_up1(Screen *self, unsigned int count/*=1*/); +void screen_insert_lines(Screen *self, unsigned int count/*=1*/); +void screen_delete_lines(Screen *self, unsigned int count/*=1*/); +void screen_delete_characters(Screen *self, unsigned int count); +void screen_erase_characters(Screen *self, unsigned int count); #define DECLARE_CH_SCREEN_HANDLER(name) void screen_##name(Screen *screen, uint8_t ch); DECLARE_CH_SCREEN_HANDLER(bell) DECLARE_CH_SCREEN_HANDLER(backspace) diff --git a/kitty/parser.c b/kitty/parser.c index f0a65987a..6323050a7 100644 --- a/kitty/parser.c +++ b/kitty/parser.c @@ -263,6 +263,14 @@ HANDLER(csi) { SET_STATE(NORMAL_STATE); \ break; +#define CALL_CSI_HANDLER1P(name, defval) \ + p1 = fill_params(screen, params, 1) > 0 ? params[0] : defval; \ + private = screen->parser_buf[0] == '?'; \ + REPORT_COMMAND(name, p1, private); \ + name(screen, p1, private); \ + SET_STATE(NORMAL_STATE); \ + break; + #define CALL_CSI_HANDLER2(name, defval1, defval2) \ count = fill_params(screen, params, 2); \ p1 = count > 0 ? params[0] : defval1; \ @@ -280,6 +288,7 @@ HANDLER(csi) { case CUD: \ CALL_CSI_HANDLER1(screen_cursor_down, 1); \ case CUF: \ + case HPR: \ CALL_CSI_HANDLER1(screen_cursor_forward, 1); \ case CUB: \ CALL_CSI_HANDLER1(screen_cursor_back1, 1); \ @@ -290,10 +299,23 @@ HANDLER(csi) { case CHA: \ CALL_CSI_HANDLER1(screen_cursor_to_column, 1); \ case CUP: \ - CALL_CSI_HANDLER2(screen_cursor_position, 1, 1); + CALL_CSI_HANDLER2(screen_cursor_position, 1, 1); \ + case ED: \ + CALL_CSI_HANDLER1P(screen_erase_in_display, 0); \ + case EL: \ + CALL_CSI_HANDLER1P(screen_erase_in_line, 0); \ + case IL: \ + CALL_CSI_HANDLER1(screen_insert_lines, 1); \ + case DL: \ + CALL_CSI_HANDLER1(screen_delete_lines, 1); \ + case DCH: \ + CALL_CSI_HANDLER1(screen_delete_characters, 1); \ + case ECH: \ + CALL_CSI_HANDLER1(screen_erase_characters, 1); \ uint8_t ch = buf[(*pos)++]; unsigned int params[MAX_PARAMS], p1, p2, count; + bool private; switch(screen->parser_buf_pos) { case 0: // CSI starting screen->parser_buf[0] = 0; diff --git a/kitty/screen.c b/kitty/screen.c index acd2b01e9..ad4bd7359 100644 --- a/kitty/screen.c +++ b/kitty/screen.c @@ -623,6 +623,7 @@ void screen_insert_characters(Screen *self, unsigned int count) { } void screen_delete_characters(Screen *self, unsigned int count) { + // Delete characters, later characters are moved left unsigned int top = self->margin_top, bottom = self->margin_bottom; if (count == 0) count = 1; if (top <= (unsigned int)self->cursor->y && (unsigned int)self->cursor->y <= bottom) { @@ -636,6 +637,7 @@ void screen_delete_characters(Screen *self, unsigned int count) { } void screen_erase_characters(Screen *self, unsigned int count) { + // Delete characters replacing them by spaces if (count == 0) count = 1; unsigned int x = self->cursor->x; unsigned int num = MIN(self->columns - x, count); diff --git a/kitty_tests/parser.py b/kitty_tests/parser.py index 030a34d75..619441908 100644 --- a/kitty_tests/parser.py +++ b/kitty_tests/parser.py @@ -73,4 +73,7 @@ class TestScreen(BaseTest): pb('\033[3;2H', ('screen_cursor_position', 3, 2)) pb('\033[3;2;H', ('screen_cursor_position', 3, 2)) self.ae(s.cursor.x, 1), self.ae(s.cursor.y, 2) + pb('\033[J', ('screen_erase_in_display', 0, 0)) + pb('\033[?J', ('screen_erase_in_display', 0, 1)) + pb('\033[?2J', ('screen_erase_in_display', 2, 1)) s.reset()