diff options
author | Harley Acheson <harley.acheson@gmail.com> | 2022-09-27 18:39:24 +0300 |
---|---|---|
committer | Harley Acheson <harley.acheson@gmail.com> | 2022-09-27 18:40:36 +0300 |
commit | 12fdf9069abe3cd2250a9efec6e059eb85ec59d8 (patch) | |
tree | a937501d90a2fd99e5ec63d4d99e6337fc4067ea /source/blender/blenkernel | |
parent | 697e86a76199c66267370f0222932b8fcb30dc3d (diff) |
BLF: Editing Text with Combining Characters
Corrections for caret insertion & movement and deletion for text
strings that include non-precomposed diacritical marks (Unicode
combining characters).
See D15659 for more details and examples.
Differential Revision: https://developer.blender.org/D15659
Reviewed by Campbell Barton
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/text.c | 26 |
1 files changed, 8 insertions, 18 deletions
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index c32ab64c478..1a0c0716fcd 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -896,8 +896,7 @@ void txt_move_left(Text *text, const bool sel) (*charp) -= tabsize; } else { - const char *prev = BLI_str_find_prev_char_utf8((*linep)->line + *charp, (*linep)->line); - *charp = prev - (*linep)->line; + BLI_str_cursor_step_prev_utf8((*linep)->line, (*linep)->len, charp); } } @@ -941,7 +940,7 @@ void txt_move_right(Text *text, const bool sel) (*charp) += tabsize; } else { - (*charp) += BLI_str_utf8_size((*linep)->line + *charp); + BLI_str_cursor_step_next_utf8((*linep)->line, (*linep)->len, charp); } } @@ -1757,8 +1756,6 @@ void txt_duplicate_line(Text *text) void txt_delete_char(Text *text) { - uint c = '\n'; - if (!text->curl) { return; } @@ -1778,10 +1775,9 @@ void txt_delete_char(Text *text) } } else { /* Just deleting a char */ - size_t c_len = text->curc; - c = BLI_str_utf8_as_unicode_step(text->curl->line, text->curl->len, &c_len); - c_len -= text->curc; - UNUSED_VARS(c); + int pos = text->curc; + BLI_str_cursor_step_next_utf8(text->curl->line, text->curl->len, &pos); + size_t c_len = pos - text->curc; memmove(text->curl->line + text->curc, text->curl->line + text->curc + c_len, @@ -1805,8 +1801,6 @@ void txt_delete_word(Text *text) void txt_backspace_char(Text *text) { - uint c = '\n'; - if (!text->curl) { return; } @@ -1828,13 +1822,9 @@ void txt_backspace_char(Text *text) txt_pop_sel(text); } else { /* Just backspacing a char */ - const char *prev = BLI_str_find_prev_char_utf8(text->curl->line + text->curc, - text->curl->line); - size_t c_len = prev - text->curl->line; - c = BLI_str_utf8_as_unicode_step(text->curl->line, text->curl->len, &c_len); - c_len -= prev - text->curl->line; - - UNUSED_VARS(c); + int pos = text->curc; + BLI_str_cursor_step_prev_utf8(text->curl->line, text->curl->len, &pos); + size_t c_len = text->curc - pos; /* source and destination overlap, don't use memcpy() */ memmove(text->curl->line + text->curc - c_len, |