diff options
| author | Scott Shawcroft <scott@adafruit.com> | 2021-04-01 10:38:51 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-01 10:38:51 -0700 |
| commit | 5425242195cbe6697f31f768f88ccc16952904d1 (patch) | |
| tree | eabe47cd8917bbf94d223250dc67ced2c97e22e4 /shared-module | |
| parent | 49091601358e2b25f2d6aae903ef235a6cc91745 (diff) | |
| parent | 171820e53f4a4cdedd7c29bef57a1adb2f695d2d (diff) | |
Merge pull request #4527 from t-ikegami/Terminal_add_esc_seqs
Add two escape sequences to terminalio.Termial
Diffstat (limited to 'shared-module')
| -rw-r--r-- | shared-module/terminalio/Terminal.c | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 4589c9149..8ef2acd1c 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -93,6 +93,41 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con self->cursor_x -= n; } } + if (c == 'J') { + if (n == 2) { + common_hal_displayio_tilegrid_set_top_left(self->tilegrid, 0, 0); + self->cursor_x = self->cursor_y = start_y = 0; + n = 0; + for (uint16_t x = 0; x < self->tilegrid->width_in_tiles; x++) { + for (uint16_t y = 0; y < self->tilegrid->height_in_tiles; y++) { + common_hal_displayio_tilegrid_set_tile(self->tilegrid, x, y, 0); + } + } + } + } + if (c == ';') { + int16_t m = 0; + for (++j; j < 9; j++) { + if ('0' <= i[j] && i[j] <= '9') { + m = m * 10 + (i[j] - '0'); + } else { + c = i[j]; + break; + } + } + if (c == 'H') { + if (n >= self->tilegrid->height_in_tiles) { + n = self->tilegrid->height_in_tiles - 1; + } + if (m >= self->tilegrid->width_in_tiles) { + m = self->tilegrid->width_in_tiles - 1; + } + n = (n + self->tilegrid->top_left_y) % self->tilegrid->height_in_tiles; + self->cursor_x = m; + self->cursor_y = n; + start_y = self->cursor_y; + } + } i += j + 1; continue; } @@ -114,12 +149,14 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con self->cursor_y %= self->tilegrid->height_in_tiles; } if (self->cursor_y != start_y) { - // clear the new row - for (uint16_t j = 0; j < self->tilegrid->width_in_tiles; j++) { - common_hal_displayio_tilegrid_set_tile(self->tilegrid, j, self->cursor_y, 0); - start_y = self->cursor_y; + // clear the new row in case of scroll up + if (self->cursor_y == self->tilegrid->top_left_y) { + for (uint16_t j = 0; j < self->tilegrid->width_in_tiles; j++) { + common_hal_displayio_tilegrid_set_tile(self->tilegrid, j, self->cursor_y, 0); + } + common_hal_displayio_tilegrid_set_top_left(self->tilegrid, 0, (self->cursor_y + self->tilegrid->height_in_tiles + 1) % self->tilegrid->height_in_tiles); } - common_hal_displayio_tilegrid_set_top_left(self->tilegrid, 0, (start_y + self->tilegrid->height_in_tiles + 1) % self->tilegrid->height_in_tiles); + start_y = self->cursor_y; } } return i - data; |
