From 74c76284747a126ce6151f5b58bec17cc303a90a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sun, 10 Sep 2017 02:02:43 +0200 Subject: [PATCH] groundwork for 256 color parsing, added conceal --- user/apars_csi.c | 33 ++++++++++++++++++++++++++++++--- user/screen.c | 30 ++++++++++++++++++++++++++++++ user/screen.h | 6 ++++++ user/sgr.h | 3 +++ 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/user/apars_csi.c b/user/apars_csi.c index a3d523a..9d847a9 100644 --- a/user/apars_csi.c +++ b/user/apars_csi.c @@ -542,8 +542,36 @@ do_csi_sgr(CSI_Data *opts) // -- set color -- else if (n >= SGR_FG_START && n <= SGR_FG_END) screen_set_fg((Color) (n - SGR_FG_START)); // ANSI normal fg else if (n >= SGR_BG_START && n <= SGR_BG_END) screen_set_bg((Color) (n - SGR_BG_START)); // ANSI normal bg + // AIX bright colors -- + else if (n >= SGR_FG_BRT_START && n <= SGR_FG_BRT_END) screen_set_fg((Color) ((n - SGR_FG_BRT_START) + 8)); // AIX bright fg + else if (n >= SGR_BG_BRT_START && n <= SGR_BG_BRT_END) screen_set_bg((Color) ((n - SGR_BG_BRT_START) + 8)); // AIX bright bg + // reset color else if (n == SGR_FG_DEFAULT) screen_set_fg(termconf_scratch.default_fg); // default fg else if (n == SGR_BG_DEFAULT) screen_set_bg(termconf_scratch.default_bg); // default bg + // 256 colors + else if (n == SGR_FG_256 || n == SGR_BG_256) { + if (i < count-2) { + if (opts->n[i + 1] == 5) { + int color = opts->n[i + 2]; + bool fg = n == SGR_FG_256; + if (fg) { + screen_set_fg_ext(color); + } else { + screen_set_bg_ext(color); + } + } + else { + ansi_warn("SGR syntax err"); + apars_show_context(); + break; // abandon further + } + i += 2; + } else { + ansi_warn("SGR syntax err"); + apars_show_context(); + break; // abandon further + } + } // -- set attr -- else if (n == SGR_BOLD) screen_set_sgr(ATTR_BOLD, 1); else if (n == SGR_FAINT) screen_set_sgr(ATTR_FAINT, 1); @@ -553,6 +581,7 @@ do_csi_sgr(CSI_Data *opts) else if (n == SGR_STRIKE) screen_set_sgr(ATTR_STRIKE, 1); else if (n == SGR_FRAKTUR) screen_set_sgr(ATTR_FRAKTUR, 1); else if (n == SGR_INVERSE) screen_set_sgr_inverse(1); + else if (n == SGR_CONCEAL) screen_set_sgr_conceal(1); // -- clear attr -- else if (n == SGR_OFF(SGR_BOLD)) screen_set_sgr(ATTR_BOLD, 0); // can also mean "Double Underline" else if (n == SGR_OFF(SGR_FAINT)) screen_set_sgr(ATTR_FAINT | ATTR_BOLD, 0); // "normal" @@ -561,9 +590,7 @@ do_csi_sgr(CSI_Data *opts) else if (n == SGR_OFF(SGR_BLINK)) screen_set_sgr(ATTR_BLINK, 0); else if (n == SGR_OFF(SGR_STRIKE)) screen_set_sgr(ATTR_STRIKE, 0); else if (n == SGR_OFF(SGR_INVERSE)) screen_set_sgr_inverse(0); - // -- AIX bright colors -- - else if (n >= SGR_FG_BRT_START && n <= SGR_FG_BRT_END) screen_set_fg((Color) ((n - SGR_FG_BRT_START) + 8)); // AIX bright fg - else if (n >= SGR_BG_BRT_START && n <= SGR_BG_BRT_END) screen_set_bg((Color) ((n - SGR_BG_BRT_START) + 8)); // AIX bright bg + else if (n == SGR_OFF(SGR_CONCEAL)) screen_set_sgr_conceal(0); else { ansi_noimpl("SGR %d", n); } diff --git a/user/screen.c b/user/screen.c index f180a27..a2ea677 100644 --- a/user/screen.c +++ b/user/screen.c @@ -76,6 +76,7 @@ typedef struct { /* SGR */ bool inverse; //!< not in attrs bc it's applied server-side (not sent to browser) + bool conceal; //!< similar to inverse, causes all to be replaced by SP u8 attrs; Color fg; //!< Foreground color for writing Color bg; //!< Background color for writing @@ -310,6 +311,7 @@ screen_reset_sgr(void) cursor.bg = termconf->default_bg; cursor.attrs = 0; cursor.inverse = false; + cursor.conceal = false; } /** @@ -1118,6 +1120,24 @@ screen_set_bg(Color color) cursor.bg = color; } +/** + * Set cursor foreground color, extended + */ +void ICACHE_FLASH_ATTR +screen_set_fg_ext(u16 color) +{ + // TODO validate and set +} + +/** + * Set cursor background color, extended + */ +void ICACHE_FLASH_ATTR +screen_set_bg_ext(u16 color) +{ + // TODO validate and set +} + void ICACHE_FLASH_ATTR screen_set_sgr(u8 attrs, bool ena) { @@ -1135,6 +1155,12 @@ screen_set_sgr_inverse(bool ena) cursor.inverse = ena; } +void ICACHE_FLASH_ATTR +screen_set_sgr_conceal(bool ena) +{ + cursor.conceal = ena; +} + void ICACHE_FLASH_ATTR screen_set_charset_n(int Gx) { @@ -1225,6 +1251,10 @@ screen_putchar(const char *ch) // clear "hanging" flag if not possible clear_invalid_hanging(); + if (cursor.conceal) { + ch = " "; + } + // Special treatment for CRLF switch (ch[0]) { case CR: diff --git a/user/screen.h b/user/screen.h index 184402a..64be988 100644 --- a/user/screen.h +++ b/user/screen.h @@ -235,10 +235,16 @@ typedef uint8_t Color; // 0-16 void screen_set_fg(Color color); /** Set cursor background coloor */ void screen_set_bg(Color color); +/** Set cursor foreground color, extended */ +void screen_set_fg_ext(u16 color); +/** Set cursor background coloor, extended */ +void screen_set_bg_ext(u16 color); /** Enable/disable attrs by bitmask */ void screen_set_sgr(u8 attrs, bool ena); /** Set the inverse attribute */ void screen_set_sgr_inverse(bool ena); +/** Conceal style */ +void screen_set_sgr_conceal(bool ena); /** Reset cursor attribs */ void screen_reset_sgr(void); diff --git a/user/sgr.h b/user/sgr.h index d87c3df..e4a086d 100644 --- a/user/sgr.h +++ b/user/sgr.h @@ -14,15 +14,18 @@ enum SGR_CODES { SGR_BLINK = 5, SGR_BLINK_FAST = 6, SGR_INVERSE = 7, + SGR_CONCEAL = 8, SGR_STRIKE = 9, SGR_FRAKTUR = 20, SGR_FG_START = 30, SGR_FG_END = 37, SGR_FG_DEFAULT = 39, + SGR_FG_256 = 38, SGR_BG_START = 40, SGR_BG_END = 47, + SGR_BG_256 = 48, SGR_BG_DEFAULT = 49, SGR_FG_BRT_START = 90,