More CSI handlers
This commit is contained in:
parent
745ba5c4cb
commit
f5fa40de81
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user