Zbigniew Jędrzejewski-Szmek 62fe94
From cb51a41fa632790ea839aa126844dfc2d74eb341 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: Thu, 2 Oct 2014 19:34:14 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] terminal/subterm: use screen renderer
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
Don't hard-code the screen renderer but use the newly introduced
Zbigniew Jędrzejewski-Szmek 62fe94
term_screen_draw() helper.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-terminal/subterm.c | 148 +++++++++++++++++++-------------------
Zbigniew Jędrzejewski-Szmek 62fe94
 1 file changed, 76 insertions(+), 72 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 adc4caa42e..563cbf0823 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
@@ -392,85 +392,89 @@ static void output_draw_menu(Output *o) {
Zbigniew Jędrzejewski-Szmek 62fe94
         output_frame_printl(o, "     ^C: send ^C to the PTY");
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-static void output_draw_screen(Output *o, term_screen *s) {
Zbigniew Jędrzejewski-Szmek 62fe94
-        unsigned int i, j;
Zbigniew Jędrzejewski-Szmek 62fe94
-        bool first = true;
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-        assert(o);
Zbigniew Jędrzejewski-Szmek 62fe94
-        assert(s);
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-        for (j = 0; j < s->page->height && j < o->in_height; ++j) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                if (!first)
Zbigniew Jędrzejewski-Szmek 62fe94
-                        output_printf(o, "\e[m\r\n" BORDER_VERT);
Zbigniew Jędrzejewski-Szmek 62fe94
-                first = false;
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-                for (i = 0; i < s->page->width && i < o->in_width; ++i) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                        term_charbuf_t buf;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        term_cell *cell = &s->page->lines[j]->cells[i];
Zbigniew Jędrzejewski-Szmek 62fe94
-                        size_t k, len, ulen;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        const uint32_t *str;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        char utf8[4];
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-                        switch (cell->attr.fg.ccode) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_DEFAULT:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[39m");
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_256:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[38;5;%um", cell->attr.fg.c256);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_RGB:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[38;2;%u;%u;%um", cell->attr.fg.red, cell->attr.fg.green, cell->attr.fg.blue);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_BLACK ... TERM_CCODE_WHITE:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                if (cell->attr.bold)
Zbigniew Jędrzejewski-Szmek 62fe94
-                                        output_printf(o, "\e[%um", cell->attr.fg.ccode - TERM_CCODE_BLACK + 90);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                else
Zbigniew Jędrzejewski-Szmek 62fe94
-                                        output_printf(o, "\e[%um", cell->attr.fg.ccode - TERM_CCODE_BLACK + 30);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[%um", cell->attr.fg.ccode - TERM_CCODE_LIGHT_BLACK + 90);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        }
Zbigniew Jędrzejewski-Szmek 62fe94
+static int output_draw_cell_fn(term_screen *screen,
Zbigniew Jędrzejewski-Szmek 62fe94
+                               void *userdata,
Zbigniew Jędrzejewski-Szmek 62fe94
+                               unsigned int x,
Zbigniew Jędrzejewski-Szmek 62fe94
+                               unsigned int y,
Zbigniew Jędrzejewski-Szmek 62fe94
+                               const term_attr *attr,
Zbigniew Jędrzejewski-Szmek 62fe94
+                               const uint32_t *ch,
Zbigniew Jędrzejewski-Szmek 62fe94
+                               size_t n_ch,
Zbigniew Jędrzejewski-Szmek 62fe94
+                               unsigned int ch_width) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        Output *o = userdata;
Zbigniew Jędrzejewski-Szmek 62fe94
+        size_t k, ulen;
Zbigniew Jędrzejewski-Szmek 62fe94
+        char utf8[4];
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (x >= o->in_width || y >= o->in_height)
Zbigniew Jędrzejewski-Szmek 62fe94
+                return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-                        switch (cell->attr.bg.ccode) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_DEFAULT:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[49m");
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_256:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[48;5;%um", cell->attr.bg.c256);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_RGB:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[48;2;%u;%u;%um", cell->attr.bg.red, cell->attr.bg.green, cell->attr.bg.blue);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_BLACK ... TERM_CCODE_WHITE:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[%um", cell->attr.bg.ccode - TERM_CCODE_BLACK + 40);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE:
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, "\e[%um", cell->attr.bg.ccode - TERM_CCODE_LIGHT_BLACK + 100);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                break;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        }
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (x == 0 && y != 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[m\r\n" BORDER_VERT);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-                        output_printf(o, "\e[%u;%u;%u;%u;%u;%um",
Zbigniew Jędrzejewski-Szmek 62fe94
-                                      cell->attr.bold ? 1 : 22,
Zbigniew Jędrzejewski-Szmek 62fe94
-                                      cell->attr.italic ? 3 : 23,
Zbigniew Jędrzejewski-Szmek 62fe94
-                                      cell->attr.underline ? 4 : 24,
Zbigniew Jędrzejewski-Szmek 62fe94
-                                      cell->attr.inverse ? 7 : 27,
Zbigniew Jędrzejewski-Szmek 62fe94
-                                      cell->attr.blink ? 5 : 25,
Zbigniew Jędrzejewski-Szmek 62fe94
-                                      cell->attr.hidden ? 8 : 28);
Zbigniew Jędrzejewski-Szmek 62fe94
+        switch (attr->fg.ccode) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_DEFAULT:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[39m");
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_256:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[38;5;%um", attr->fg.c256);
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_RGB:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[38;2;%u;%u;%um", attr->fg.red, attr->fg.green, attr->fg.blue);
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_BLACK ... TERM_CCODE_WHITE:
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (attr->bold)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 90);
Zbigniew Jędrzejewski-Szmek 62fe94
+                else
Zbigniew Jędrzejewski-Szmek 62fe94
+                        output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 30);
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_LIGHT_BLACK + 90);
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-                        str = term_char_resolve(cell->ch, &len, &buf;;
Zbigniew Jędrzejewski-Szmek 62fe94
+        switch (attr->bg.ccode) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_DEFAULT:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[49m");
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_256:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[48;5;%um", attr->bg.c256);
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_RGB:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[48;2;%u;%u;%um", attr->bg.red, attr->bg.green, attr->bg.blue);
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_BLACK ... TERM_CCODE_WHITE:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[%um", attr->bg.ccode - TERM_CCODE_BLACK + 40);
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE:
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, "\e[%um", attr->bg.ccode - TERM_CCODE_LIGHT_BLACK + 100);
Zbigniew Jędrzejewski-Szmek 62fe94
+                break;
Zbigniew Jędrzejewski-Szmek 62fe94
+        }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-                        if (len < 1) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                                output_printf(o, " ");
Zbigniew Jędrzejewski-Szmek 62fe94
-                        } else {
Zbigniew Jędrzejewski-Szmek 62fe94
-                                for (k = 0; k < len; ++k) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                                        ulen = term_utf8_encode(utf8, str[k]);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                        output_write(o, utf8, ulen);
Zbigniew Jędrzejewski-Szmek 62fe94
-                                }
Zbigniew Jędrzejewski-Szmek 62fe94
-                        }
Zbigniew Jędrzejewski-Szmek 62fe94
+        output_printf(o, "\e[%u;%u;%u;%u;%u;%um",
Zbigniew Jędrzejewski-Szmek 62fe94
+                      attr->bold ? 1 : 22,
Zbigniew Jędrzejewski-Szmek 62fe94
+                      attr->italic ? 3 : 23,
Zbigniew Jędrzejewski-Szmek 62fe94
+                      attr->underline ? 4 : 24,
Zbigniew Jędrzejewski-Szmek 62fe94
+                      attr->inverse ? 7 : 27,
Zbigniew Jędrzejewski-Szmek 62fe94
+                      attr->blink ? 5 : 25,
Zbigniew Jędrzejewski-Szmek 62fe94
+                      attr->hidden ? 8 : 28);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (n_ch < 1) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                output_printf(o, " ");
Zbigniew Jędrzejewski-Szmek 62fe94
+        } else {
Zbigniew Jędrzejewski-Szmek 62fe94
+                for (k = 0; k < n_ch; ++k) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                        ulen = term_utf8_encode(utf8, ch[k]);
Zbigniew Jędrzejewski-Szmek 62fe94
+                        output_write(o, utf8, ulen);
Zbigniew Jędrzejewski-Szmek 62fe94
                 }
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+        return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+static void output_draw_screen(Output *o, term_screen *s) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        assert(o);
Zbigniew Jędrzejewski-Szmek 62fe94
+        assert(s);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        term_screen_draw(s, output_draw_cell_fn, o, NULL);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
         output_move_to(o, s->cursor_x + 1, s->cursor_y + 3);
Zbigniew Jędrzejewski-Szmek 62fe94
         output_printf(o, "\e[m");
Zbigniew Jędrzejewski-Szmek 62fe94
 }