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

@ -894,7 +894,8 @@ void term_cursor_up(struct terminal *term, int count);
void term_cursor_down(struct terminal *term, int count);
void term_cursor_blink_update(struct terminal *term);
void term_print(struct terminal *term, char32_t wc, int width);
void term_print(struct terminal *term, char32_t wc, int width,
bool insert_mode_disable);
void term_fill(struct terminal *term, int row, int col, uint8_t c, size_t count,
bool use_sgr_attrs);