X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fterm-screen.c;h=145dcdaee55ac1ae06544cc1e6c577fd43345569;hp=2c881ca8b1c6e832b294f135f8bbb0ec08139993;hb=ce04e2335ab80eda5674de3399aa16b5aea2657f;hpb=2ea8d19b210b62a02ebcb38f035e074dcba66426 diff --git a/src/libsystemd-terminal/term-screen.c b/src/libsystemd-terminal/term-screen.c index 2c881ca8b..145dcdaee 100644 --- a/src/libsystemd-terminal/term-screen.c +++ b/src/libsystemd-terminal/term-screen.c @@ -2944,31 +2944,9 @@ static int screen_SGR(term_screen *screen, const term_seq *seq) { if (i >= seq->n_args || seq->args[i] < 0) break; + dst->ccode = TERM_CCODE_256; code = seq->args[i]; - if (code < 16) { - dst->ccode = code; - } else if (code < 232) { - static const uint8_t bval[] = { - 0x00, 0x5f, 0x87, - 0xaf, 0xd7, 0xff, - }; - - dst->ccode = TERM_CCODE_256; - dst->c256 = code; - code -= 16; - dst->blue = bval[code % 6]; - code /= 6; - dst->green = bval[code % 6]; - code /= 6; - dst->red = bval[code % 6]; - } else if (code < 256) { - dst->ccode = TERM_CCODE_256; - dst->c256 = code; - code = (code - 232) * 10 + 8; - dst->red = code; - dst->green = code; - dst->blue = code; - } + dst->c256 = code < 256 ? code : 0; break; } @@ -3757,6 +3735,12 @@ unsigned int term_screen_get_height(term_screen *screen) { return screen->page->height; } +uint64_t term_screen_get_age(term_screen *screen) { + assert_return(screen, 0); + + return screen->age; +} + int term_screen_feed_text(term_screen *screen, const uint8_t *in, size_t size) { uint32_t *ucs4_str; size_t i, j, ucs4_len; @@ -3765,6 +3749,8 @@ int term_screen_feed_text(term_screen *screen, const uint8_t *in, size_t size) { assert_return(screen, -EINVAL); + ++screen->age; + /* Feed bytes into utf8 decoder and handle parsed ucs4 chars. We always * treat data as UTF-8, but the parser makes sure to fall back to raw * 8bit mode if the stream is not valid UTF-8. This should be more than @@ -4246,6 +4232,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 +4247,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); @@ -4273,7 +4266,7 @@ int term_screen_draw(term_screen *screen, } if (fb_age) - *fb_age = screen->age++; + *fb_age = screen->age; return 0; }