X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fsubterm.c;h=93c06bea831f50a0b58d3adb83cc47c7b378fa6c;hb=378c4eed029eb37eec31e56bd82ca5df2dee1e73;hp=46ab6b4a1e7c85ecd96e1b0cc9adc9cba244a5dc;hpb=3f8916fb0dd9eb8c4c4979045d3e2b223f776698;p=elogind.git diff --git a/src/libsystemd-terminal/subterm.c b/src/libsystemd-terminal/subterm.c index 46ab6b4a1..93c06bea8 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; @@ -386,92 +393,92 @@ static void output_draw_frame(Output *o) { static void output_draw_menu(Output *o) { assert(o); - output_frame_printl(o, ""); + output_frame_printl(o, "%s", ""); output_frame_printl(o, " Menu: (the following keys are recognized)"); output_frame_printl(o, " q: quit"); output_frame_printl(o, " ^C: send ^C to the PTY"); } -static void output_draw_screen(Output *o, term_screen *s) { - unsigned int i, j; - bool first = true; - - assert(o); - assert(s); - - for (j = 0; j < s->page->height && j < o->in_height; ++j) { - if (!first) - output_printf(o, "\e[m\r\n" BORDER_VERT); - first = false; - - for (i = 0; i < s->page->width && i < o->in_width; ++i) { - term_charbuf_t buf; - term_cell *cell = &s->page->lines[j]->cells[i]; - size_t k, len, ulen; - const uint32_t *str; - char utf8[4]; - - switch (cell->attr.fg.ccode) { - case TERM_CCODE_DEFAULT: - output_printf(o, "\e[39m"); - break; - case TERM_CCODE_256: - output_printf(o, "\e[38;5;%um", cell->attr.fg.c256); - break; - case TERM_CCODE_RGB: - output_printf(o, "\e[38;2;%u;%u;%um", cell->attr.fg.red, cell->attr.fg.green, cell->attr.fg.blue); - break; - case TERM_CCODE_BLACK ... TERM_CCODE_WHITE: - if (cell->attr.bold) - output_printf(o, "\e[%um", cell->attr.fg.ccode - TERM_CCODE_BLACK + 90); - else - output_printf(o, "\e[%um", cell->attr.fg.ccode - TERM_CCODE_BLACK + 30); - break; - case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE: - output_printf(o, "\e[%um", cell->attr.fg.ccode - TERM_CCODE_LIGHT_BLACK + 90); - break; - } +static int output_draw_cell_fn(term_screen *screen, + void *userdata, + unsigned int x, + unsigned int y, + const term_attr *attr, + const uint32_t *ch, + size_t n_ch, + unsigned int ch_width) { + Output *o = userdata; + size_t k, ulen; + char utf8[4]; + + if (x >= o->in_width || y >= o->in_height) + return 0; - switch (cell->attr.bg.ccode) { - case TERM_CCODE_DEFAULT: - output_printf(o, "\e[49m"); - break; - case TERM_CCODE_256: - output_printf(o, "\e[48;5;%um", cell->attr.bg.c256); - break; - case TERM_CCODE_RGB: - output_printf(o, "\e[48;2;%u;%u;%um", cell->attr.bg.red, cell->attr.bg.green, cell->attr.bg.blue); - break; - case TERM_CCODE_BLACK ... TERM_CCODE_WHITE: - output_printf(o, "\e[%um", cell->attr.bg.ccode - TERM_CCODE_BLACK + 40); - break; - case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE: - output_printf(o, "\e[%um", cell->attr.bg.ccode - TERM_CCODE_LIGHT_BLACK + 100); - break; - } + if (x == 0 && y != 0) + output_printf(o, "\e[m\r\n" BORDER_VERT); - output_printf(o, "\e[%u;%u;%u;%u;%u;%um", - cell->attr.bold ? 1 : 22, - cell->attr.italic ? 3 : 23, - cell->attr.underline ? 4 : 24, - cell->attr.inverse ? 7 : 27, - cell->attr.blink ? 5 : 25, - cell->attr.hidden ? 8 : 28); + switch (attr->fg.ccode) { + case TERM_CCODE_DEFAULT: + output_printf(o, "\e[39m"); + break; + case TERM_CCODE_256: + output_printf(o, "\e[38;5;%um", attr->fg.c256); + break; + case TERM_CCODE_RGB: + output_printf(o, "\e[38;2;%u;%u;%um", attr->fg.red, attr->fg.green, attr->fg.blue); + break; + case TERM_CCODE_BLACK ... TERM_CCODE_WHITE: + output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_BLACK + 30); + break; + case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE: + output_printf(o, "\e[%um", attr->fg.ccode - TERM_CCODE_LIGHT_BLACK + 90); + break; + } - str = term_char_resolve(cell->ch, &len, &buf); + switch (attr->bg.ccode) { + case TERM_CCODE_DEFAULT: + output_printf(o, "\e[49m"); + break; + case TERM_CCODE_256: + output_printf(o, "\e[48;5;%um", attr->bg.c256); + break; + case TERM_CCODE_RGB: + output_printf(o, "\e[48;2;%u;%u;%um", attr->bg.red, attr->bg.green, attr->bg.blue); + break; + case TERM_CCODE_BLACK ... TERM_CCODE_WHITE: + output_printf(o, "\e[%um", attr->bg.ccode - TERM_CCODE_BLACK + 40); + break; + case TERM_CCODE_LIGHT_BLACK ... TERM_CCODE_LIGHT_WHITE: + output_printf(o, "\e[%um", attr->bg.ccode - TERM_CCODE_LIGHT_BLACK + 100); + break; + } - if (len < 1) { - output_printf(o, " "); - } else { - for (k = 0; k < len; ++k) { - ulen = term_utf8_encode(utf8, str[k]); - output_write(o, utf8, ulen); - } - } + output_printf(o, "\e[%u;%u;%u;%u;%u;%um", + attr->bold ? 1 : 22, + attr->italic ? 3 : 23, + attr->underline ? 4 : 24, + attr->inverse ? 7 : 27, + attr->blink ? 5 : 25, + attr->hidden ? 8 : 28); + + if (n_ch < 1) { + output_printf(o, " "); + } else { + for (k = 0; k < n_ch; ++k) { + ulen = term_utf8_encode(utf8, ch[k]); + output_write(o, utf8, ulen); } } - output_move_to(o, s->cursor_x + 1, s->cursor_y + 3); + return 0; +} + +static void output_draw_screen(Output *o, term_screen *s) { + assert(o); + assert(s); + + term_screen_draw(s, output_draw_cell_fn, o, NULL); + output_printf(o, "\e[m"); } @@ -535,10 +542,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 @@ -564,7 +567,7 @@ static void output_draw(Output *o, bool menu, term_screen *screen) { */ static void terminal_dirty(Terminal *t) { - uint64_t usec; + usec_t usec; int r; assert(t); @@ -716,10 +719,10 @@ static int terminal_io_fn(sd_event_source *source, int fd, uint32_t revents, voi for (i = 0; i < len; ++i) { const term_seq *seq; - const uint32_t *str; + uint32_t *str; size_t n_str, j; - str = term_utf8_decode(&t->utf8, &n_str, buf[i]); + n_str = term_utf8_decode(&t->utf8, &str, buf[i]); for (j = 0; j < n_str; ++j) { type = term_parser_feed(t->parser, &seq, str[j]); if (type < 0) {