From ea851962c1f4f1d30e350de3f4aa7bfbea135dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 26 Dec 2021 14:34:17 +0100 Subject: [PATCH] term: add term_put_char() This function prints a single, non-double width, character to the grid. It handles OSC-8 hyperlinks, but does not: * update the cursor location * erase sixels --- terminal.c | 36 ++++++++++++++++++++++++++++++++++++ terminal.h | 1 + 2 files changed, 37 insertions(+) diff --git a/terminal.c b/terminal.c index d9d66bac..6119f68c 100644 --- a/terminal.c +++ b/terminal.c @@ -3498,6 +3498,42 @@ print_spacer(struct terminal *term, int col, int remaining) cell->attrs = term->vt.attrs; } +/* + * Puts a character on the grid. Coordinates are in screen coordinates + * (i.e. ‘cursor’ coordinates). + * + * Does NOT: + * - update the cursor + * - linewrap + * - erase sixels + * + * Limitiations: + * - double width characters not supported + */ +void +term_put_char(struct terminal *term, int r, int c, wchar_t wc) +{ + struct row *row = grid_row(term->grid, r); + row->dirty = true; + + struct cell *cell = &row->cells[c]; + cell->wc = wc; + cell->attrs = term->vt.attrs; + + if (unlikely(term->vt.osc8.uri != NULL)) { + grid_row_uri_range_put(row, c, term->vt.osc8.uri, term->vt.osc8.id); + + switch (term->conf->url.osc8_underline) { + case OSC8_UNDERLINE_ALWAYS: + cell->attrs.url = true; + break; + + case OSC8_UNDERLINE_URL_MODE: + break; + } + } +} + void term_print(struct terminal *term, char32_t wc, int width) { diff --git a/terminal.h b/terminal.h index ec2ff963..8abc1c8e 100644 --- a/terminal.h +++ b/terminal.h @@ -797,6 +797,7 @@ void term_cursor_up(struct terminal *term, int count); void term_cursor_down(struct terminal *term, int count); void term_cursor_blink_update(struct terminal *term); +void term_put_char(struct terminal *term, int r, int c, char32_t wc); void term_print(struct terminal *term, char32_t wc, int width); void term_scroll(struct terminal *term, int rows);