search: ad-hoc workaround for combining characters with positive x-offsets

When rendering the search input box, do the same ad-hoc workaround for
combining characters with a positive x-offset as we do when rendering
normal grid cells.

In this case, we don’t *know* when we’re dealing with combining
characters. But we can detect zero-width characters. For these, check
their glyph’s x-offset. If positive, adjust it like we do when
rendering combining glyphs in the main grid, to ensure the glyph is
positioned over the _previous_ character, not the next.
This commit is contained in:
Daniel Eklöf 2021-01-25 10:00:43 +01:00
parent 569795a529
commit f9a43209f2
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 9 additions and 2 deletions

View file

@ -61,6 +61,7 @@
* Scrollback search not matching composed characters.
* High CPU usage when holding down e.g. arrow keys while in scrollback
search mode.
* Rendering of composed characters in the scrollback search box.
### Security

View file

@ -2212,7 +2212,7 @@ render_search_box(struct terminal *term)
/* Calculate the width of each character */
int widths[text_len + 1];
for (size_t i = 0; i < text_len; i++)
widths[i] = max(1, wcwidth(text[i]));
widths[i] = max(0, wcwidth(text[i]));
widths[text_len] = 0;
const size_t total_cells = wcswidth(text, text_len);
@ -2403,10 +2403,16 @@ render_search_box(struct terminal *term)
x + glyph->x, y + font_baseline(term) - glyph->y,
glyph->width, glyph->height);
} else {
int combining_ofs = width == 0
? (glyph->x < 0
? width * term->cell_width
: (width - 1) * term->cell_width)
: 0; /* Not a zero-width character - no additional offset */
pixman_image_t *src = pixman_image_create_solid_fill(&fg);
pixman_image_composite32(
PIXMAN_OP_OVER, src, glyph->pix, buf->pix[0], 0, 0, 0, 0,
x + glyph->x, y + font_baseline(term) - glyph->y,
x + combining_ofs + glyph->x,
y + font_baseline(term) - glyph->y,
glyph->width, glyph->height);
pixman_image_unref(src);
}