diff --git a/common/lib/gterm.c b/common/lib/gterm.c index b1a63f21..4abad5d1 100644 --- a/common/lib/gterm.c +++ b/common/lib/gterm.c @@ -523,6 +523,14 @@ void gterm_set_text_bg_bright(size_t bg) { text_bg = ansi_bright_colours[bg]; } +void gterm_set_text_fg_rgb(uint32_t fg) { + text_fg = fg; +} + +void gterm_set_text_bg_rgb(uint32_t bg) { + text_bg = bg; +} + void gterm_set_text_fg_default(void) { text_fg = default_fg; } diff --git a/common/lib/gterm.h b/common/lib/gterm.h index 3f4f3d45..6b3686a5 100644 --- a/common/lib/gterm.h +++ b/common/lib/gterm.h @@ -21,6 +21,8 @@ void gterm_set_text_fg(size_t fg); void gterm_set_text_bg(size_t bg); void gterm_set_text_fg_bright(size_t fg); void gterm_set_text_bg_bright(size_t bg); +void gterm_set_text_fg_rgb(uint32_t fg); +void gterm_set_text_bg_rgb(uint32_t bg); void gterm_set_text_fg_default(void); void gterm_set_text_bg_default(void); bool gterm_scroll_disable(void); diff --git a/common/lib/term.c b/common/lib/term.c index 9d317d2a..167c58f0 100644 --- a/common/lib/term.c +++ b/common/lib/term.c @@ -56,6 +56,8 @@ void term_vbe(char *config, size_t width, size_t height) { set_text_bg = gterm_set_text_bg; set_text_fg_bright = gterm_set_text_fg_bright; set_text_bg_bright = gterm_set_text_bg_bright; + set_text_fg_rgb = gterm_set_text_fg_rgb; + set_text_bg_rgb = gterm_set_text_bg_rgb; set_text_fg_default = gterm_set_text_fg_default; set_text_bg_default = gterm_set_text_bg_default; scroll_disable = gterm_scroll_disable; @@ -155,6 +157,8 @@ void term_textmode(void) { term_reinit(); + term_notready(); + raw_putchar = text_putchar; clear = text_clear; enable_cursor = text_enable_cursor; @@ -427,7 +431,40 @@ set_bg_bright: } continue; } + + // 256/RGB + else if (esc_values[i] == 38 || esc_values[i] == 48) { + bool fg = esc_values[i] == 38; + + i++; + if (i >= esc_values_i) { + break; + } + + switch (esc_values[i]) { + case 2: { // RGB + if (i + 3 >= esc_values_i) { + goto out; + } + + uint32_t rgb_value = 0; + + rgb_value |= esc_values[i + 1] << 16; + rgb_value |= esc_values[i + 2] << 8; + rgb_value |= esc_values[i + 3]; + + i += 3; + + fg ? set_text_fg_rgb(rgb_value) : set_text_bg_rgb(rgb_value); + + break; + } + default: continue; + } + } } + +out:; } static void dec_private_parse(uint8_t c) { diff --git a/common/lib/term.h b/common/lib/term.h index 1dd25af4..4305ab77 100644 --- a/common/lib/term.h +++ b/common/lib/term.h @@ -71,6 +71,8 @@ extern void (*set_text_fg)(size_t fg); extern void (*set_text_bg)(size_t bg); extern void (*set_text_fg_bright)(size_t fg); extern void (*set_text_bg_bright)(size_t bg); +extern void (*set_text_fg_rgb)(uint32_t fg); +extern void (*set_text_bg_rgb)(uint32_t bg); extern void (*set_text_fg_default)(void); extern void (*set_text_bg_default)(void); extern bool (*scroll_disable)(void); diff --git a/common/lib/term.s2.c b/common/lib/term.s2.c index a5bf47bf..7da107d1 100644 --- a/common/lib/term.s2.c +++ b/common/lib/term.s2.c @@ -22,6 +22,8 @@ void (*set_text_fg)(size_t fg); void (*set_text_bg)(size_t bg); void (*set_text_fg_bright)(size_t fg); void (*set_text_bg_bright)(size_t bg); +void (*set_text_fg_rgb)(uint32_t fg); +void (*set_text_bg_rgb)(uint32_t bg); void (*set_text_fg_default)(void); void (*set_text_bg_default)(void); bool (*scroll_disable)(void); @@ -184,6 +186,9 @@ static void notready_move_character(size_t a, size_t b, size_t c, size_t d) { static uint64_t notready_context_size(void) { return 0; } +static void notready_uint32_t(uint32_t n) { + (void)n; +} static void notready_uint64_t(uint64_t n) { (void)n; } @@ -201,6 +206,8 @@ void term_notready(void) { set_text_bg = notready_size_t; set_text_fg_bright = notready_size_t; set_text_bg_bright = notready_size_t; + set_text_fg_rgb = notready_uint32_t; + set_text_bg_rgb = notready_uint32_t; set_text_fg_default = notready_void; set_text_bg_default = notready_void; scroll_disable = notready_disable;