From dfc9554e89fa741884b2140f0f1c9c2b74da0220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 1 Jul 2019 21:13:24 +0200 Subject: [PATCH] render: always render cursor --- main.c | 44 +++++++++++++++++++++++++++----------------- terminal.c | 2 -- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/main.c b/main.c index f81771ab..5c2876e6 100644 --- a/main.c +++ b/main.c @@ -260,20 +260,6 @@ grid_render_erase(struct context *c, struct buffer *buf, const struct damage *dm cairo_fill(buf->cairo); wl_surface_damage_buffer(c->wl.surface, x, y, width, height); } - - /* Redraw cursor, if it's inside the erased range */ - if (c->term.cursor.linear >= dmg->range.start - c->term.grid->offset && - c->term.cursor.linear < dmg->range.start - c->term.grid->offset + dmg->range.length) - { - grid_render_update( - c, buf, - &(struct damage){ - .type = DAMAGE_UPDATE, - .range = { - .start = c->term.grid->offset + c->term.cursor.linear, - .length = 1} - }); - } } static void @@ -362,18 +348,19 @@ grid_render_scroll_reverse(struct context *c, struct buffer *buf, static void grid_render(struct context *c) { + struct buffer *buf = shm_get_buffer(c->wl.shm, c->width, c->height); + cairo_set_operator(buf->cairo, CAIRO_OPERATOR_SOURCE); + if (tll_length(c->term.grid->damage) == 0 && tll_length(c->term.grid->scroll_damage) == 0) { - return; + goto render_cursor; } assert(c->width > 0); assert(c->height > 0); - struct buffer *buf = shm_get_buffer(c->wl.shm, c->width, c->height); - cairo_set_operator(buf->cairo, CAIRO_OPERATOR_SOURCE); tll_foreach(c->term.grid->scroll_damage, it) { switch (it->item.type) { @@ -408,6 +395,29 @@ grid_render(struct context *c) tll_remove(c->term.grid->damage, it); } +render_cursor: + ; + + /* TODO: break out to function */ + /* Re-render last cursor cell and current cursor cell */ + static struct cursor last_cursor = {.linear = 0, .col = 0, .row = 0}; + + if (last_cursor.linear != c->term.cursor.linear) { + struct damage prev_cursor = { + .type = DAMAGE_UPDATE, + .range = {.start = c->term.grid->offset + last_cursor.linear, + .length = 1}, + }; + grid_render_update(c, buf, &prev_cursor); + } + + struct damage cursor = { + .type = DAMAGE_UPDATE, + .range = {.start = c->term.grid->offset + c->term.cursor.linear, .length = 1}, + }; + grid_render_update(c, buf, &cursor); + last_cursor = c->term.cursor; + c->term.grid->offset %= c->term.grid->size; //cairo_surface_flush(buf->cairo_surface); diff --git a/terminal.c b/terminal.c index c6129953..952476f3 100644 --- a/terminal.c +++ b/terminal.c @@ -156,8 +156,6 @@ term_cursor_to(struct terminal *term, int row, int col) int new_linear = row * term->cols + col; assert(new_linear < term->rows * term->cols); - term_damage_update(term, term->cursor.linear, 1); - term_damage_update(term, new_linear, 1); term->print_needs_wrap = false; term->cursor.linear = new_linear;