summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2017-01-25 22:27:17 -0500
committerJesse Luehrs <doy@tozt.net>2017-01-25 22:27:17 -0500
commitda065599801b35070a83217ab79d7c22a2b5024b (patch)
treed6abf65cb810fbf4f29414d9bb82ec3273c929c0
parent32f97d8385d591ec4026f3fb5a1ab8e34e12a06d (diff)
downloadlibvt100-da065599801b35070a83217ab79d7c22a2b5024b.tar.gz
libvt100-da065599801b35070a83217ab79d7c22a2b5024b.zip
allow specifying whether or not emoji are wide
vim says yes, weechat says no ¯\_(ツ)_/¯
-rw-r--r--src/screen.c7
-rw-r--r--src/screen.h2
-rw-r--r--src/unicode-extra.c11
-rw-r--r--src/unicode-extra.h2
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 <stdint.h>
-int vt100_char_width(uint32_t codepoint);
+int vt100_char_width(uint32_t codepoint, int wide_emoji);
#endif