mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-15 05:33:58 -04:00
render: scrollback indicator: implement 'relative' and 'line' variants
We now implement all combinations of 'scrollback-indicator-style' and 'scrollback-indicator-format'.
This commit is contained in:
parent
67758a7cb7
commit
2e519ed5b6
1 changed files with 41 additions and 9 deletions
50
render.c
50
render.c
|
|
@ -1303,8 +1303,6 @@ render_scrollback_position(struct terminal *term)
|
||||||
|
|
||||||
win->scrollback_indicator_surface = NULL;
|
win->scrollback_indicator_surface = NULL;
|
||||||
win->scrollback_indicator_sub_surface = NULL;
|
win->scrollback_indicator_sub_surface = NULL;
|
||||||
|
|
||||||
LOG_INFO("destroyed indicator surfaces");
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -1334,7 +1332,6 @@ render_scrollback_position(struct terminal *term)
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_subsurface_set_sync(win->scrollback_indicator_sub_surface);
|
wl_subsurface_set_sync(win->scrollback_indicator_sub_surface);
|
||||||
LOG_INFO("instantiated indicator surfaces");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(win->scrollback_indicator_surface != NULL);
|
assert(win->scrollback_indicator_surface != NULL);
|
||||||
|
|
@ -1356,14 +1353,30 @@ render_scrollback_position(struct terminal *term)
|
||||||
* 0% -> at the beginning of the scrollback
|
* 0% -> at the beginning of the scrollback
|
||||||
* 100% -> at the bottom, i.e. where new lines are inserted
|
* 100% -> at the bottom, i.e. where new lines are inserted
|
||||||
*/
|
*/
|
||||||
int percentage =
|
unsigned percent =
|
||||||
rebased_view + term->rows == term->grid->num_rows
|
rebased_view + term->rows == term->grid->num_rows
|
||||||
? 100
|
? 100
|
||||||
: 100 * rebased_view / term->grid->num_rows;
|
: 100 * rebased_view / term->grid->num_rows;
|
||||||
|
|
||||||
|
wchar_t text[64];
|
||||||
|
int cell_count;
|
||||||
|
|
||||||
|
/* *What* to render */
|
||||||
|
switch (term->conf->scrollback.indicator.format) {
|
||||||
|
case SCROLLBACK_INDICATOR_FORMAT_PERCENT:
|
||||||
|
swprintf(text, sizeof(text) / sizeof(text[0]), L"%u%%", percent);
|
||||||
|
cell_count = 3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SCROLLBACK_INDICATOR_FORMAT_LINENO:
|
||||||
|
swprintf(text, sizeof(text) / sizeof(text[0]), L"%d", rebased_view + 1);
|
||||||
|
cell_count = 1 + (int)log10(term->grid->num_rows);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
const int scale = term->scale;
|
const int scale = term->scale;
|
||||||
const int margin = 3 * scale;
|
const int margin = 3 * scale;
|
||||||
const int width = 2 * margin + 3 * term->cell_width; /* TODO: this is percent only */
|
const int width = 2 * margin + cell_count * term->cell_width;
|
||||||
const int height = 2 * margin + term->cell_height;
|
const int height = 2 * margin + term->cell_height;
|
||||||
|
|
||||||
unsigned long cookie = shm_cookie_scrollback_indicator(term);
|
unsigned long cookie = shm_cookie_scrollback_indicator(term);
|
||||||
|
|
@ -1378,9 +1391,7 @@ render_scrollback_position(struct terminal *term)
|
||||||
struct fcft_font *font = term->fonts[0];
|
struct fcft_font *font = term->fonts[0];
|
||||||
pixman_color_t fg = color_hex_to_pixman(term->colors.table[7]);
|
pixman_color_t fg = color_hex_to_pixman(term->colors.table[7]);
|
||||||
|
|
||||||
wchar_t text[64];
|
/* Sub-surface relative coordinates */
|
||||||
swprintf(text, sizeof(text) / sizeof(text[0]), L"%d%%", percentage);
|
|
||||||
|
|
||||||
unsigned x = width - margin - wcslen(text) * term->cell_width;
|
unsigned x = width - margin - wcslen(text) * term->cell_width;
|
||||||
const unsigned y = margin;
|
const unsigned y = margin;
|
||||||
|
|
||||||
|
|
@ -1401,10 +1412,31 @@ render_scrollback_position(struct terminal *term)
|
||||||
x += term->cell_width;
|
x += term->cell_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* *Where* to render - parent relative coordinates */
|
||||||
|
int surf_top = 0;
|
||||||
|
switch (term->conf->scrollback.indicator.style) {
|
||||||
|
case SCROLLBACK_INDICATOR_STYLE_NONE:
|
||||||
|
assert(false);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case SCROLLBACK_INDICATOR_STYLE_FIXED:
|
||||||
|
surf_top = margin + term->cell_height;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SCROLLBACK_INDICATOR_STYLE_RELATIVE: {
|
||||||
|
int lines = term->rows - 2; /* Avoid using first and last row */
|
||||||
|
assert(lines > 0);
|
||||||
|
|
||||||
|
int on_line = 1 + percent * lines / 100;
|
||||||
|
surf_top = margin + on_line * term->cell_height;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wl_subsurface_set_position(
|
wl_subsurface_set_position(
|
||||||
win->scrollback_indicator_sub_surface,
|
win->scrollback_indicator_sub_surface,
|
||||||
(term->width - term->margins.right - width) / scale,
|
(term->width - term->margins.right - width) / scale,
|
||||||
term->margins.top / scale + term->cell_height);
|
surf_top / scale);
|
||||||
wl_surface_attach(win->scrollback_indicator_surface, buf->wl_buf, 0, 0);
|
wl_surface_attach(win->scrollback_indicator_surface, buf->wl_buf, 0, 0);
|
||||||
wl_surface_damage_buffer(win->scrollback_indicator_surface, 0, 0, width, height);
|
wl_surface_damage_buffer(win->scrollback_indicator_surface, 0, 0, width, height);
|
||||||
wl_surface_set_buffer_scale(win->scrollback_indicator_surface, scale);
|
wl_surface_set_buffer_scale(win->scrollback_indicator_surface, scale);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue