diff options
Diffstat (limited to 'utf8.c')
-rw-r--r-- | utf8.c | 34 |
1 files changed, 32 insertions, 2 deletions
@@ -22,7 +22,6 @@ #include <errno.h> #include <stdlib.h> #include <string.h> -#include <vis.h> #include <wchar.h> #include "tmux.h" @@ -303,7 +302,38 @@ utf8_append(struct utf8_data *ud, u_char ch) return (UTF8_DONE); } -/* +/* Get width of Unicode character. */ +static int +utf8_width(wchar_t wc) +{ + int width; + +#ifdef HAVE_UTF8PROC + width = utf8proc_wcwidth(wc); +#else + width = wcwidth(wc); +#endif + if (width < 0 || width > 0xff) { + log_debug("Unicode %04lx, wcwidth() %d", (long)wc, width); + +#ifndef __OpenBSD__ + /* + * Many platforms (particularly and inevitably OS X) have no + * width for relatively common characters (wcwidth() returns + * -1); assume width 1 in this case. This will be wrong for + * genuinely nonprintable characters, but they should be + * rare. We may pass through stuff that ideally we would block, + * but this is no worse than sending the same to the terminal + * without tmux. + */ + if (width < 0) + return (1); +#endif + return (-1); + } + return (width); +} + * Encode len characters from src into dst, which is guaranteed to have four * bytes available for each character from src (for \abc or UTF-8) plus space * for \0. |