From da065599801b35070a83217ab79d7c22a2b5024b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 25 Jan 2017 22:27:17 -0500 Subject: allow specifying whether or not emoji are wide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit vim says yes, weechat says no ¯\_(ツ)_/¯ --- src/screen.c | 7 ++++++- src/screen.h | 2 ++ src/unicode-extra.c | 11 ++++++----- src/unicode-extra.h | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/screen.c b/src/screen.c index b909cfb..dd1eccc 100644 --- a/src/screen.c +++ b/src/screen.c @@ -107,6 +107,11 @@ void vt100_screen_set_scrollback_length(VT100Screen *vt, int rows) vt->custom_scrollback_length = 1; } +void vt100_screen_set_wide_emoji(VT100Screen *vt, int wide_emoji) +{ + vt->wide_emoji = wide_emoji; +} + int vt100_screen_process_string(VT100Screen *vt, char *buf, size_t len) { struct vt100_parser_state *state = vt->parser_state; @@ -204,7 +209,7 @@ void vt100_screen_show_string_utf8(VT100Screen *vt, char *buf, size_t len) int width; uc = g_utf8_get_char(c); - width = vt100_char_width(uc); + width = vt100_char_width(uc, vt->wide_emoji); if (width == 0) { if (vt->grid->cur.col > 0) { diff --git a/src/screen.h b/src/screen.h index bd52d49..af48400 100644 --- a/src/screen.h +++ b/src/screen.h @@ -105,12 +105,14 @@ struct vt100_screen { unsigned int dirty: 1; unsigned int custom_scrollback_length: 1; + unsigned int wide_emoji: 1; }; VT100Screen *vt100_screen_new(int rows, int cols); void vt100_screen_init(VT100Screen *vt); void vt100_screen_set_window_size(VT100Screen *vt, int rows, int cols); void vt100_screen_set_scrollback_length(VT100Screen *vt, int rows); +void vt100_screen_set_wide_emoji(VT100Screen *vt, int wide_emoji); int vt100_screen_process_string(VT100Screen *vt, char *buf, size_t len); void vt100_screen_get_string_plaintext( VT100Screen *vt, struct vt100_loc *start, struct vt100_loc *end, diff --git a/src/unicode-extra.c b/src/unicode-extra.c index 69e5c76..b661aef 100644 --- a/src/unicode-extra.c +++ b/src/unicode-extra.c @@ -66,15 +66,15 @@ static struct vt100_char_range vt100_wide_emoji[] = { }; static int vt100_is_zero_width(uint32_t codepoint); -static int vt100_is_wide_char(uint32_t codepoint); +static int vt100_is_wide_char(uint32_t codepoint, int wide_emoji); static int vt100_is_wide_emoji(uint32_t codepoint); -int vt100_char_width(uint32_t codepoint) +int vt100_char_width(uint32_t codepoint, int wide_emoji) { if (vt100_is_zero_width(codepoint)) { return 0; } - else if (vt100_is_wide_char(codepoint)) { + else if (vt100_is_wide_char(codepoint, wide_emoji)) { return 2; } else { @@ -89,9 +89,10 @@ static int vt100_is_zero_width(uint32_t codepoint) return g_unichar_iszerowidth(codepoint) || codepoint == 0xAD; } -static int vt100_is_wide_char(uint32_t codepoint) +static int vt100_is_wide_char(uint32_t codepoint, int wide_emoji) { - return g_unichar_iswide(codepoint) || vt100_is_wide_emoji(codepoint); + return g_unichar_iswide(codepoint) + || (wide_emoji && vt100_is_wide_emoji(codepoint)); } static int vt100_is_wide_emoji(uint32_t codepoint) diff --git a/src/unicode-extra.h b/src/unicode-extra.h index be3b28b..befec7a 100644 --- a/src/unicode-extra.h +++ b/src/unicode-extra.h @@ -3,6 +3,6 @@ #include -int vt100_char_width(uint32_t codepoint); +int vt100_char_width(uint32_t codepoint, int wide_emoji); #endif -- cgit v1.2.3