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