From 33c8e169de90de592e07cf4ff6b6aa93fedb1149 Mon Sep 17 00:00:00 2001 From: speedie Date: Fri, 21 Jul 2023 01:23:43 +0200 Subject: [PATCH] Add true color SGR sequence support --- libs/draw.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/libs/draw.c b/libs/draw.c index 3320a99..858366f 100644 --- a/libs/draw.c +++ b/libs/draw.c @@ -188,7 +188,6 @@ int drawitemtext(struct item *item, int x, int y, int w) { ox = x; oy = y; ow = w; - int width = 0; // parse item text for (character = 0, escape = 0; item->text[escape]; escape++) { @@ -202,7 +201,6 @@ int drawitemtext(struct item *item, int x, int y, int w) { // position and width x += MIN(w, TEXTW(buffer) - sp.lrpad + leftpadding); - width += MIN(w, TEXTW(buffer) - sp.lrpad + leftpadding); w -= MIN(w, TEXTW(buffer) - sp.lrpad + leftpadding); // no highlighting if colored text @@ -237,7 +235,16 @@ int drawitemtext(struct item *item, int x, int y, int w) { fg &= ~8; fgcol = txtcols[fg]; } else if (nextchar == 38) { - bgfg = 2; + int r, g, b; + + strtoul(c_character + 1, &c_character, 10); + + r = strtoul(c_character + 1, &c_character, 10); + g = strtoul(c_character + 1, &c_character, 10); + b = strtoul(c_character + 1, &c_character, 10); + + fgcol = malloc(8 * sizeof(char)); + snprintf(fgcol, 8, "#%02X%02X%02X", r, g, b); } else if (nextchar >= 30 && nextchar <= 37) { fg = nextchar % 10 | (fg & 8); fgcol = txtcols[fg]; @@ -245,7 +252,16 @@ int drawitemtext(struct item *item, int x, int y, int w) { bg = nextchar % 10; bgcol = txtcols[bg]; } else if (nextchar == 48) { - bgfg = 3; + int r, g, b; + + strtoul(c_character + 1, &c_character, 10); + + r = strtoul(c_character + 1, &c_character, 10); + g = strtoul(c_character + 1, &c_character, 10); + b = strtoul(c_character + 1, &c_character, 10); + + bgcol = malloc(8 * sizeof(char)); + snprintf(bgcol, 8, "#%02X%02X%02X", r, g, b); } else if (nextchar == 0) { fgcol = ofgcol; bgcol = obgcol; @@ -268,20 +284,20 @@ int drawitemtext(struct item *item, int x, int y, int w) { // now draw any non-colored text apply_fribidi(buffer); - int r = draw_text(draw, x, y, w, sp.bh, leftpadding, isrtl ? fribidi_text : buffer, 0, pango_item ? True : False, fgcol, bgcol, fga, bga); + int ret = draw_text(draw, x, y, w, sp.bh, leftpadding, isrtl ? fribidi_text : buffer, 0, pango_item ? True : False, fgcol, bgcol, fga, bga); if (!hidehighlight) drawhighlights(item, ox, oy, ow, oleftpadding, item->nsgrtext); if (!hidepowerline && powerlineitems && selitem) { if (itempwlstyle == 2) { - draw_circle(draw, r, y, sp.plw, sp.bh, 1, col_menu, obgcol, alpha_menu, obga); + draw_circle(draw, ret, y, sp.plw, sp.bh, 1, col_menu, obgcol, alpha_menu, obga); } else { - draw_arrow(draw, r, y, sp.plw, sp.bh, 1, itempwlstyle, col_menu, obgcol, alpha_menu, obga); + draw_arrow(draw, ret, y, sp.plw, sp.bh, 1, itempwlstyle, col_menu, obgcol, alpha_menu, obga); } } - return r; + return ret; } int drawitem(int x, int y, int w) {