aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/tui/tui.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 4736e7a8ba..72f93976c1 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -57,6 +57,7 @@ typedef struct {
int enable_mouse, disable_mouse;
int enable_bracketed_paste, disable_bracketed_paste;
int enter_insert_mode, exit_insert_mode;
+ int set_rgb_foreground, set_rgb_background;
} unibi_ext;
} TUIData;
@@ -135,7 +136,7 @@ void tui_start(void)
data->winch_handle.data = ui;
ui->stop = tui_stop;
- ui->rgb = false;
+ ui->rgb = os_getenv("NVIM_TUI_ENABLE_TRUE_COLOR") != NULL;
ui->data = data;
ui->resize = tui_resize;
ui->clear = tui_clear;
@@ -231,14 +232,33 @@ static void update_attrs(UI *ui, HlAttrs attrs)
data->print_attrs = attrs;
unibi_out(ui, unibi_exit_attribute_mode);
- data->params[0].i = attrs.foreground != -1 ? attrs.foreground : data->fg;
- if (data->params[0].i != -1) {
- unibi_out(ui, unibi_set_a_foreground);
- }
+ int fg = attrs.foreground != -1 ? attrs.foreground : data->fg;
+ int bg = attrs.background != -1 ? attrs.background : data->bg;
+
+ if (ui->rgb) {
+ if (fg != -1) {
+ data->params[0].i = (fg >> 16) & 0xff; // red
+ data->params[1].i = (fg >> 8) & 0xff; // green
+ data->params[2].i = fg & 0xff; // blue
+ unibi_out(ui, data->unibi_ext.set_rgb_foreground);
+ }
+
+ if (bg != -1) {
+ data->params[0].i = (bg >> 16) & 0xff; // red
+ data->params[1].i = (bg >> 8) & 0xff; // green
+ data->params[2].i = bg & 0xff; // blue
+ unibi_out(ui, data->unibi_ext.set_rgb_background);
+ }
+ } else {
+ if (fg != -1) {
+ data->params[0].i = fg;
+ unibi_out(ui, unibi_set_a_foreground);
+ }
- data->params[0].i = attrs.background != -1 ? attrs.background : data->bg;
- if (data->params[0].i != -1) {
- unibi_out(ui, unibi_set_a_background);
+ if (bg != -1) {
+ data->params[0].i = bg;
+ unibi_out(ui, unibi_set_a_background);
+ }
}
if (attrs.bold) {
@@ -769,6 +789,10 @@ end:
"\x1b[?1002h\x1b[?1006h");
data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(ut, NULL,
"\x1b[?1002l\x1b[?1006l");
+ data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, NULL,
+ "\x1b[38;2;%p1%d;%p2%d;%p3%dm");
+ data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, NULL,
+ "\x1b[48;2;%p1%d;%p2%d;%p3%dm");
unibi_set_if_empty(ut, unibi_cursor_address, "\x1b[%i%p1%d;%p2%dH");
unibi_set_if_empty(ut, unibi_exit_attribute_mode, "\x1b[0;10m");
unibi_set_if_empty(ut, unibi_set_a_foreground, XTERM_SETAF);