mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
render: don't render cursor if it is not in view
This commit is contained in:
parent
ed0fd2d442
commit
1bb5afeb0a
1 changed files with 28 additions and 18 deletions
46
render.c
46
render.c
|
|
@ -35,13 +35,8 @@ static struct glyph_sequence gseq;
|
|||
|
||||
static void
|
||||
render_cell(struct terminal *term, struct buffer *buf, const struct cell *cell,
|
||||
int col, int row)
|
||||
int col, int row, bool has_cursor)
|
||||
{
|
||||
/* Cursor here? */
|
||||
bool has_cursor
|
||||
= (!term->hide_cursor &&
|
||||
(term->cursor.col == col && term->cursor.row == row));
|
||||
|
||||
double width = term->cell_width;
|
||||
double height = term->cell_height;
|
||||
double x = col * width;
|
||||
|
|
@ -251,7 +246,7 @@ grid_render(struct terminal *term)
|
|||
//LOG_WARN("rendering line: %d", r);
|
||||
|
||||
for (int col = 0; col < term->cols; col++)
|
||||
render_cell(term, buf, &row->cells[col], col, r);
|
||||
render_cell(term, buf, &row->cells[col], col, r, false);
|
||||
|
||||
row->dirty = false;
|
||||
all_clean = false;
|
||||
|
|
@ -266,10 +261,10 @@ grid_render(struct terminal *term)
|
|||
= (term->grid->offset + term->cursor.row) * term->cols + term->cursor.col;
|
||||
|
||||
if (last_cursor != cursor_as_linear) {
|
||||
int row = last_cursor / term->cols - term->grid->view;
|
||||
int row = last_cursor / term->cols - term->grid->offset;
|
||||
int col = last_cursor % term->cols;
|
||||
if (row >= 0 && row < term->rows) {
|
||||
render_cell(term, buf, &grid_row_in_view(term->grid, row)->cells[col], col, row);
|
||||
render_cell(term, buf, &grid_row_in_view(term->grid, row)->cells[col], col, row, false);
|
||||
all_clean = false;
|
||||
|
||||
wl_surface_damage_buffer(
|
||||
|
|
@ -284,16 +279,31 @@ grid_render(struct terminal *term)
|
|||
return;
|
||||
}
|
||||
|
||||
render_cell(
|
||||
term, buf,
|
||||
&grid_row_in_view(term->grid, term->cursor.row)->cells[term->cursor.col],
|
||||
term->cursor.col, term->cursor.row);
|
||||
bool cursor_is_visible = false;
|
||||
int view_end = (term->grid->view + term->rows - 1) % term->grid->num_rows;
|
||||
int cursor_row = (term->grid->offset + term->cursor.row) % term->grid->num_rows;
|
||||
if (view_end >= term->grid->view) {
|
||||
/* Not wrapped */
|
||||
if (cursor_row >= term->grid->view && cursor_row <= view_end)
|
||||
cursor_is_visible = true;
|
||||
} else {
|
||||
/* Wrapped */
|
||||
if (cursor_row >= term->grid->view || cursor_row <= view_end)
|
||||
cursor_is_visible = true;
|
||||
}
|
||||
|
||||
wl_surface_damage_buffer(
|
||||
term->wl.surface,
|
||||
term->cursor.col * term->cell_width,
|
||||
term->cursor.row * term->cell_height,
|
||||
term->cell_width, term->cell_height);
|
||||
if (cursor_is_visible) {
|
||||
render_cell(
|
||||
term, buf,
|
||||
&grid_row_in_view(term->grid, term->cursor.row)->cells[term->cursor.col],
|
||||
term->cursor.col, term->cursor.row, true);
|
||||
|
||||
wl_surface_damage_buffer(
|
||||
term->wl.surface,
|
||||
term->cursor.col * term->cell_width,
|
||||
term->cursor.row * term->cell_height,
|
||||
term->cell_width, term->cell_height);
|
||||
}
|
||||
|
||||
if (gseq.count > 0) {
|
||||
cairo_set_scaled_font(buf->cairo, attrs_to_font(term, &gseq.attrs));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue