From cad8fe9a2b2ac340ef69233dd32e1bb1e45dae48 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Fri, 3 Oct 2014 14:42:42 +0200 Subject: [PATCH] terminal/screen: add cursor rendering This is the most simple way to render cursors: flip attr->inverse of the cursor cell. This causes the background and foreground colors of the cursor-cell to be inversed. Now that we render cursors ourselves, make subterm not call into the parent terminal to render cursors. --- src/libsystemd-terminal/subterm.c | 11 +++++++---- src/libsystemd-terminal/term-screen.c | 9 ++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/libsystemd-terminal/subterm.c b/src/libsystemd-terminal/subterm.c index 563cbf082..321cd35f5 100644 --- a/src/libsystemd-terminal/subterm.c +++ b/src/libsystemd-terminal/subterm.c @@ -286,6 +286,8 @@ static Output *output_free(Output *o) { if (!o) return NULL; + /* re-enable cursor */ + output_printf(o, "\e[?25h"); /* disable alternate screen buffer */ output_printf(o, "\e[?1049l"); output_flush(o); @@ -317,6 +319,11 @@ static int output_new(Output **out, int fd) { if (r < 0) goto error; + /* always hide cursor */ + r = output_printf(o, "\e[?25l"); + if (r < 0) + goto error; + r = output_flush(o); if (r < 0) goto error; @@ -539,10 +546,6 @@ static void output_draw(Output *o, bool menu, term_screen *screen) { else output_draw_screen(o, screen); - /* show cursor */ - if (!(screen->flags & TERM_FLAG_HIDE_CURSOR)) - output_printf(o, "\e[?25h"); - /* * Hack: sd-term was not written to support TTY as output-objects, thus * expects callers to use term_screen_feed_keyboard(). However, we diff --git a/src/libsystemd-terminal/term-screen.c b/src/libsystemd-terminal/term-screen.c index 2c881ca8b..ccfb9a450 100644 --- a/src/libsystemd-terminal/term-screen.c +++ b/src/libsystemd-terminal/term-screen.c @@ -4246,6 +4246,8 @@ int term_screen_draw(term_screen *screen, line_age = MAX(line->age, page->age); for (i = 0; i < page->width; ++i) { + term_attr attr; + cell = &line->cells[i]; cell_age = MAX(cell->age, line_age); @@ -4259,11 +4261,16 @@ int term_screen_draw(term_screen *screen, * renderers can assume ch_width is set properpy. */ cw = MAX(cell->cwidth, 1U); + attr = cell->attr; + if (i == screen->cursor_x && j == screen->cursor_y && + !(screen->flags & TERM_FLAG_HIDE_CURSOR)) + attr.inverse ^= 1; + r = draw_fn(screen, userdata, i, j, - &cell->attr, + &attr, ch_str, ch_n, cw); -- 2.30.2