84 lines
3.2 KiB
Diff
84 lines
3.2 KiB
Diff
|
From cad8fe9a2b2ac340ef69233dd32e1bb1e45dae48 Mon Sep 17 00:00:00 2001
|
||
|
From: David Herrmann <dh.herrmann@gmail.com>
|
||
|
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 563cbf0823..321cd35f52 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 2c881ca8b1..ccfb9a450c 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);
|