diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2018-10-02 15:10:47 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-02 15:10:47 +0200 |
commit | 14ae394532aae5e1be3b20c0ade98b9d7625ae4b (patch) | |
tree | 5a95ec5559c1415a1d691605c2b54f14b5ae10c8 /src | |
parent | 171c80e22769868a1174480c2feeb6675d2828c5 (diff) | |
parent | c4006a621eff1761208b0aa38057f4668b4a6ba8 (diff) | |
download | rneovim-14ae394532aae5e1be3b20c0ade98b9d7625ae4b.tar.gz rneovim-14ae394532aae5e1be3b20c0ade98b9d7625ae4b.tar.bz2 rneovim-14ae394532aae5e1be3b20c0ade98b9d7625ae4b.zip |
Merge pull request #9052 from blueyed/undercurl
tui: add support for undercurl and colored underline
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/tui/tui.c | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index bc7d2ca42a..2c93c95ecc 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -118,6 +118,7 @@ typedef struct { int resize_screen; int reset_scroll_region; int set_cursor_style, reset_cursor_style; + int enter_undercurl_mode, exit_undercurl_mode, set_underline_color; } unibi_ext; } TUIData; @@ -438,15 +439,16 @@ static void sigwinch_cb(SignalWatcher *watcher, int signum, void *data) static bool attrs_differ(HlAttrs a1, HlAttrs a2, bool rgb) { if (rgb) { - // TODO(bfredl): when we start to support special color, - // rgb_sp_color must be added here return a1.rgb_fg_color != a2.rgb_fg_color || a1.rgb_bg_color != a2.rgb_bg_color - || a1.rgb_ae_attr != a2.rgb_ae_attr; + || a1.rgb_ae_attr != a2.rgb_ae_attr + || a1.rgb_sp_color != a2.rgb_sp_color; } else { return a1.cterm_fg_color != a2.cterm_fg_color || a1.cterm_bg_color != a2.cterm_bg_color - || a1.cterm_ae_attr != a2.cterm_ae_attr; + || a1.cterm_ae_attr != a2.cterm_ae_attr + || (a1.cterm_ae_attr & (HL_UNDERLINE|HL_UNDERCURL) + && a1.rgb_sp_color != a2.rgb_sp_color); } } @@ -483,13 +485,21 @@ static void update_attrs(UI *ui, HlAttrs attrs) bool italic = attr & HL_ITALIC; bool reverse = attr & HL_INVERSE; bool standout = attr & HL_STANDOUT; - bool underline = attr & HL_UNDERLINE; - bool undercurl = attr & HL_UNDERCURL; + + bool underline; + bool undercurl; + if (data->unibi_ext.enter_undercurl_mode) { + underline = attr & HL_UNDERLINE; + undercurl = attr & HL_UNDERCURL; + } else { + underline = (attr & HL_UNDERLINE) || (attr & HL_UNDERCURL); + undercurl = false; + } if (unibi_get_str(data->ut, unibi_set_attributes)) { - if (bold || reverse || underline || undercurl || standout) { + if (bold || reverse || underline || standout) { UNIBI_SET_NUM_VAR(data->params[0], standout); - UNIBI_SET_NUM_VAR(data->params[1], underline || undercurl); + UNIBI_SET_NUM_VAR(data->params[1], underline); UNIBI_SET_NUM_VAR(data->params[2], reverse); UNIBI_SET_NUM_VAR(data->params[3], 0); // blink UNIBI_SET_NUM_VAR(data->params[4], 0); // dim @@ -508,7 +518,7 @@ static void update_attrs(UI *ui, HlAttrs attrs) if (bold) { unibi_out(ui, unibi_enter_bold_mode); } - if (underline || undercurl) { + if (underline) { unibi_out(ui, unibi_enter_underline_mode); } if (standout) { @@ -521,6 +531,18 @@ static void update_attrs(UI *ui, HlAttrs attrs) if (italic) { unibi_out(ui, unibi_enter_italics_mode); } + if (undercurl && data->unibi_ext.enter_undercurl_mode) { + unibi_out_ext(ui, data->unibi_ext.enter_undercurl_mode); + } + if ((undercurl || underline) && data->unibi_ext.set_underline_color) { + int color = attrs.rgb_sp_color; + if (color != -1) { + UNIBI_SET_NUM_VAR(data->params[0], (color >> 16) & 0xff); // red + UNIBI_SET_NUM_VAR(data->params[1], (color >> 8) & 0xff); // green + UNIBI_SET_NUM_VAR(data->params[2], color & 0xff); // blue + unibi_out_ext(ui, data->unibi_ext.set_underline_color); + } + } if (ui->rgb) { if (fg != -1) { UNIBI_SET_NUM_VAR(data->params[0], (fg >> 16) & 0xff); // red @@ -1817,6 +1839,20 @@ static void augment_terminfo(TUIData *data, const char *term, ut, "ext.enable_mouse", "\x1b[?1002h\x1b[?1006h"); data->unibi_ext.disable_mouse = (int)unibi_add_ext_str( ut, "ext.disable_mouse", "\x1b[?1002l\x1b[?1006l"); + + if ((int)unibi_add_ext_bool(ut, "Su", 0)) { + data->unibi_ext.enter_undercurl_mode = (int)unibi_add_ext_str( + ut, "ext.enter_undercurl_mode", "\x1b[4:3m"); + data->unibi_ext.exit_undercurl_mode = (int)unibi_add_ext_str( + ut, "ext.exit_underline_mode", "\x1b[4:0m"); + if (has_colon_rgb) { + data->unibi_ext.set_underline_color = (int)unibi_add_ext_str( + ut, "ext.set_underline_color", "\x1b[58:2:%p1%d:%p2%d:%p3%dm"); + } else { + data->unibi_ext.set_underline_color = (int)unibi_add_ext_str( + ut, "ext.set_underline_color", "\x1b[58:2:%p1%d:%p2%d:%p3%dm"); + } + } } static void flush_buf(UI *ui) |