term: insert-mode: handle combining characters correctly

When the client application emits combining characters, for example
multi-codepoint emojis, in insert-mode, we ended up pushing partial
graphemes to the right, for each codepoint, resulting in too many
cells (and with the wrong content) being inserted.

The fix is fairly simple; don't "insert" when appending characters to
an existing grapheme cluster.

This isn't something we can detect easily in print_insert() (it would
require us to do grapheme clustering again). Fortunately, we do have
the required information in action_utf8_print(). So, pass this
information as a boolean to term_print().

Closes #1947
This commit is contained in:
Daniel Eklöf 2025-02-06 07:31:30 +01:00
parent dd01783f88
commit 88dcde3ed8
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 14 additions and 6 deletions

View file

@ -3896,7 +3896,7 @@ term_fill(struct terminal *term, int r, int c, uint8_t data, size_t count,
}
void
term_print(struct terminal *term, char32_t wc, int width)
term_print(struct terminal *term, char32_t wc, int width, bool insert_mode_disable)
{
xassert(width > 0);
@ -3918,7 +3918,8 @@ term_print(struct terminal *term, char32_t wc, int width)
}
print_linewrap(term);
print_insert(term, width);
if (!insert_mode_disable)
print_insert(term, width);
int col = grid->cursor.point.col;
@ -3990,7 +3991,7 @@ term_print(struct terminal *term, char32_t wc, int width)
static void
ascii_printer_generic(struct terminal *term, char32_t wc)
{
term_print(term, wc, 1);
term_print(term, wc, 1, false);
}
static void