mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-15 08:21:03 -04:00
Merge branch 'dont-let-jump-labels-extend-outside-window-geometry'
Closes #443
This commit is contained in:
commit
4cb8172373
2 changed files with 60 additions and 27 deletions
|
|
@ -40,6 +40,8 @@
|
||||||
|
|
||||||
* Underline cursor is now rendered below text underline
|
* Underline cursor is now rendered below text underline
|
||||||
(https://codeberg.org/dnkl/foot/issues/415).
|
(https://codeberg.org/dnkl/foot/issues/415).
|
||||||
|
* Foot now tries much harder to keep URL jump labels inside the window
|
||||||
|
geometry (https://codeberg.org/dnkl/foot/issues/443).
|
||||||
|
|
||||||
|
|
||||||
### Deprecated
|
### Deprecated
|
||||||
|
|
|
||||||
85
render.c
85
render.c
|
|
@ -2632,6 +2632,26 @@ render_urls(struct terminal *term)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int col = pos->col;
|
||||||
|
int row = pos->row - term->grid->view;
|
||||||
|
while (row < 0)
|
||||||
|
row += term->grid->num_rows;
|
||||||
|
row &= (term->grid->num_rows - 1);
|
||||||
|
|
||||||
|
/* Position label slightly above and to the left */
|
||||||
|
int x = col * term->cell_width - 15 * term->cell_width / 10;
|
||||||
|
int y = row * term->cell_height - 5 * term->cell_height / 10;
|
||||||
|
|
||||||
|
/* Don’t position it outside our window */
|
||||||
|
if (x < -term->margins.left)
|
||||||
|
x = -term->margins.left;
|
||||||
|
if (y < -term->margins.top)
|
||||||
|
y = -term->margins.top;
|
||||||
|
|
||||||
|
/* Maximum width of label, in pixels */
|
||||||
|
const int max_width =
|
||||||
|
term->width - term->margins.left - term->margins.right - x;
|
||||||
|
|
||||||
const size_t key_len = wcslen(key);
|
const size_t key_len = wcslen(key);
|
||||||
|
|
||||||
size_t url_len = mbstowcs(NULL, url->url, 0);
|
size_t url_len = mbstowcs(NULL, url->url, 0);
|
||||||
|
|
@ -2641,32 +2661,59 @@ render_urls(struct terminal *term)
|
||||||
wchar_t url_wchars[url_len + 1];
|
wchar_t url_wchars[url_len + 1];
|
||||||
mbstowcs(url_wchars, url->url, url_len + 1);
|
mbstowcs(url_wchars, url->url, url_len + 1);
|
||||||
|
|
||||||
|
/* Format label, not yet subject to any size limitations */
|
||||||
size_t chars = key_len + (show_url ? (2 + url_len) : 0);
|
size_t chars = key_len + (show_url ? (2 + url_len) : 0);
|
||||||
|
wchar_t label[chars + 1];
|
||||||
const size_t max_chars = 50;
|
label[chars] = L'\0';
|
||||||
chars = min(chars, max_chars);
|
|
||||||
|
|
||||||
wchar_t label[chars + 2];
|
|
||||||
label[chars] = L'…';
|
|
||||||
label[chars + 1] = L'\0';
|
|
||||||
|
|
||||||
if (show_url)
|
if (show_url)
|
||||||
swprintf(label, chars + 1, L"%ls: %ls", key, url_wchars);
|
swprintf(label, chars + 1, L"%ls: %ls", key, url_wchars);
|
||||||
else
|
else
|
||||||
wcsncpy(label, key, chars + 1);
|
wcsncpy(label, key, chars);
|
||||||
|
|
||||||
|
/* Upper case the key characters */
|
||||||
for (size_t i = 0; i < wcslen(key); i++)
|
for (size_t i = 0; i < wcslen(key); i++)
|
||||||
label[i] = towupper(label[i]);
|
label[i] = towupper(label[i]);
|
||||||
|
|
||||||
|
/* Blank already entered key characters */
|
||||||
for (size_t i = 0; i < entered_key_len; i++)
|
for (size_t i = 0; i < entered_key_len; i++)
|
||||||
label[i] = L' ';
|
label[i] = L' ';
|
||||||
|
|
||||||
size_t len = wcslen(label);
|
/*
|
||||||
int cols = wcswidth(label, len);
|
* Don’t extend outside our window
|
||||||
|
*
|
||||||
|
* Truncate label so that it doesn’t extend outside our
|
||||||
|
* window.
|
||||||
|
*
|
||||||
|
* Do it in a way such that we don’t cut the label in the
|
||||||
|
* middle of a double-width character.
|
||||||
|
*/
|
||||||
const int scale = term->scale;
|
const int scale = term->scale;
|
||||||
const int x_margin = 2 * scale;
|
const int x_margin = 2 * scale;
|
||||||
const int y_margin = 1 * scale;
|
const int y_margin = 1 * scale;
|
||||||
|
const int max_cols = max_width / term->cell_width;
|
||||||
|
|
||||||
|
int cols = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i <= wcslen(label); i++) {
|
||||||
|
int _cols = wcswidth(label, i);
|
||||||
|
|
||||||
|
if (_cols == (size_t)-1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (_cols >= max_cols) {
|
||||||
|
if (i > 0)
|
||||||
|
label[i - 1] = L'…';
|
||||||
|
label[i] = L'\0';
|
||||||
|
cols = max_cols;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cols = _cols;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cols == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
const int width =
|
const int width =
|
||||||
(2 * x_margin + cols * term->cell_width + scale - 1) / scale * scale;
|
(2 * x_margin + cols * term->cell_width + scale - 1) / scale * scale;
|
||||||
const int height =
|
const int height =
|
||||||
|
|
@ -2675,22 +2722,6 @@ render_urls(struct terminal *term)
|
||||||
struct buffer *buf = shm_get_buffer(
|
struct buffer *buf = shm_get_buffer(
|
||||||
term->wl->shm, width, height, shm_cookie_url(url), false, 1);
|
term->wl->shm, width, height, shm_cookie_url(url), false, 1);
|
||||||
|
|
||||||
int col = pos->col;
|
|
||||||
int row = pos->row - term->grid->view;
|
|
||||||
while (row < 0)
|
|
||||||
row += term->grid->num_rows;
|
|
||||||
row &= (term->grid->num_rows - 1);
|
|
||||||
|
|
||||||
int x = col * term->cell_width - 15 * term->cell_width / 10;
|
|
||||||
int y = row * term->cell_height - 5 * term->cell_height / 10;
|
|
||||||
|
|
||||||
if (x < 0)
|
|
||||||
x = 0;
|
|
||||||
#if 0
|
|
||||||
if (y < 0)
|
|
||||||
y += 15 * term->cell_height / 10;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
wl_subsurface_set_position(
|
wl_subsurface_set_position(
|
||||||
sub_surf,
|
sub_surf,
|
||||||
(term->margins.left + x) / term->scale,
|
(term->margins.left + x) / term->scale,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue