From d3cd4ad933b033e750aa92801945f2cac213f88e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Thu, 31 Oct 2024 07:17:35 +0100 Subject: [PATCH] char32: use utf8proc_charwidth() instead of wcwidth(), when available It appears to be slightly more up-to-date with recent Unicode versions. In particular, it handles the new "Symbols for Legacy Computing Supplement" block, introduced in Unicode 16. Closes #1865 --- CHANGELOG.md | 5 +++++ char32.h | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7e9939d..cc734b81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,11 @@ * OSC-9: sequences beginning with `;` are now ignored. These sequences are ConEmu/Windows Terminal sequences, and not intended to be notifications. +* Use `utf8proc_charwidth()` instead of `wcwidth()`+`wcswidth()` when + calculating character width, when foot has been built with utf8proc + support ([#1865][1865]). + +[1865]: https://codeberg.org/dnkl/foot/issues/1865 ### Deprecated diff --git a/char32.h b/char32.h index 6324c9a0..6a5eb080 100644 --- a/char32.h +++ b/char32.h @@ -8,6 +8,10 @@ #include #include +#if defined(FOOT_GRAPHEME_CLUSTERING) + #include +#endif + static inline size_t c32len(const char32_t *s) { return wcslen((const wchar_t *)s); } @@ -69,11 +73,22 @@ static inline bool isc32graph(char32_t c32) { } static inline int c32width(char32_t c) { +#if defined(FOOT_GRAPHEME_CLUSTERING) + return utf8proc_charwidth((utf8proc_int32_t)c); +#else return wcwidth((wchar_t)c); +#endif } static inline int c32swidth(const char32_t *s, size_t n) { +#if defined(FOOT_GRAPHEME_CLUSTERING) + int width = 0; + for (size_t i = 0; i < n; i++) + width += utf8proc_charwidth((utf8proc_int32_t)s[i]); + return width; +#else return wcswidth((const wchar_t *)s, n); +#endif } size_t mbsntoc32(char32_t *dst, const char *src, size_t nms, size_t len);