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

@ -105,9 +105,13 @@
([#1929][1929]).
* Foot not closing file descriptors for unrecognized or `no_keymap`
keymaps.
* Combining characters (including emojis consisting of multiple
codepoints) not being handled correctly when _insert mode_ is
enabled ([#1947][1947]).
[1918]: https://codeberg.org/dnkl/foot/issues/1918
[1929]: https://codeberg.org/dnkl/foot/issues/1929
[1947]: https://codeberg.org/dnkl/foot/issues/1947
### Security