Add support for OSC color sequences - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 8e310303903792c010d03c046ba75f8b18f7d3a7
 (DIR) parent 2f6e597ed871cff91c627850d03152cae5f45779
 (HTM) Author: Raheman Vaiya <r.vaiya@gmail.com>
       Date:   Sun, 26 Dec 2021 18:57:04 +0100
       
       Add support for OSC color sequences
       
       Diffstat:
         M config.def.h                        |       8 +++++---
         M st.c                                |      80 ++++++++++++++++++++++++++++++-
         M st.h                                |       3 +++
         M x.c                                 |      13 +++++++++++++
       
       4 files changed, 100 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       @@ -120,6 +120,8 @@ static const char *colorname[] = {
                /* more colors can be added after 255 to use with DefaultXX */
                "#cccccc",
                "#555555",
       +        "gray90", /* default foreground colour */
       +        "black", /* default background colour */
        };
        
        
       @@ -127,9 +129,9 @@ static const char *colorname[] = {
         * Default colors (colorname index)
         * foreground, background, cursor, reverse cursor
         */
       -unsigned int defaultfg = 7;
       -unsigned int defaultbg = 0;
       -static unsigned int defaultcs = 256;
       +unsigned int defaultfg = 258;
       +unsigned int defaultbg = 259;
       +unsigned int defaultcs = 256;
        static unsigned int defaultrcs = 257;
        
        /*
 (DIR) diff --git a/st.c b/st.c
       @@ -1843,6 +1843,42 @@ csireset(void)
        }
        
        void
       +osc4_color_response(int num)
       +{
       +        int n;
       +        char buf[32];
       +        unsigned char r, g, b;
       +
       +        if (xgetcolor(num, &r, &g, &b)) {
       +                fprintf(stderr, "erresc: failed to fetch osc4 color %d\n", num);
       +                return;
       +        }
       +
       +        n = snprintf(buf, sizeof buf, "\033]4;%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
       +                     num, r, r, g, g, b, b);
       +
       +        ttywrite(buf, n, 1);
       +}
       +
       +void
       +osc_color_response(int index, int num)
       +{
       +        int n;
       +        char buf[32];
       +        unsigned char r, g, b;
       +
       +        if (xgetcolor(index, &r, &g, &b)) {
       +                fprintf(stderr, "erresc: failed to fetch osc color %d\n", index);
       +                return;
       +        }
       +
       +        n = snprintf(buf, sizeof buf, "\033]%d;rgb:%02x%02x/%02x%02x/%02x%02x\007",
       +                     num, r, r, g, g, b, b);
       +
       +        ttywrite(buf, n, 1);
       +}
       +
       +void
        strhandle(void)
        {
                char *p = NULL, *dec;
       @@ -1880,6 +1916,45 @@ strhandle(void)
                                        }
                                }
                                return;
       +                case 10:
       +                        if (narg < 2)
       +                                break;
       +
       +                        p = strescseq.args[1];
       +
       +                        if (!strcmp(p, "?"))
       +                                osc_color_response(defaultfg, 10);
       +                        else if (xsetcolorname(defaultfg, p))
       +                                fprintf(stderr, "erresc: invalid foreground color: %s\n", p);
       +                        else
       +                                redraw();
       +                        break;
       +                case 11:
       +                        if (narg < 2)
       +                                break;
       +
       +                        p = strescseq.args[1];
       +
       +                        if (!strcmp(p, "?"))
       +                                osc_color_response(defaultbg, 11);
       +                        else if (xsetcolorname(defaultbg, p))
       +                                fprintf(stderr, "erresc: invalid background color: %s\n", p);
       +                        else
       +                                redraw();
       +                        break;
       +                case 12:
       +                        if (narg < 2)
       +                                break;
       +
       +                        p = strescseq.args[1];
       +
       +                        if (!strcmp(p, "?"))
       +                                osc_color_response(defaultcs, 12);
       +                        else if (xsetcolorname(defaultcs, p))
       +                                fprintf(stderr, "erresc: invalid cursor color: %s\n", p);
       +                        else
       +                                redraw();
       +                        break;
                        case 4: /* color set */
                                if (narg < 3)
                                        break;
       @@ -1887,7 +1962,10 @@ strhandle(void)
                                /* FALLTHROUGH */
                        case 104: /* color reset, here p = NULL */
                                j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
       -                        if (xsetcolorname(j, p)) {
       +
       +                        if (!strcmp(p, "?"))
       +                                osc4_color_response(j);
       +                        else if (xsetcolorname(j, p)) {
                                        if (par == 104 && narg <= 1)
                                                return; /* color reset without parameter */
                                        fprintf(stderr, "erresc: invalid color j=%d, p=%s\n",
 (DIR) diff --git a/st.h b/st.h
       @@ -111,6 +111,8 @@ void *xmalloc(size_t);
        void *xrealloc(void *, size_t);
        char *xstrdup(const char *);
        
       +int xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b);
       +
        /* config.h globals */
        extern char *utmp;
        extern char *scroll;
       @@ -123,3 +125,4 @@ extern char *termname;
        extern unsigned int tabspaces;
        extern unsigned int defaultfg;
        extern unsigned int defaultbg;
       +extern unsigned int defaultcs;
 (DIR) diff --git a/x.c b/x.c
       @@ -800,6 +800,19 @@ xloadcols(void)
        }
        
        int
       +xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b)
       +{
       +        if (!BETWEEN(x, 0, dc.collen))
       +                return 1;
       +
       +        *r = dc.col[x].color.red >> 8;
       +        *g = dc.col[x].color.green >> 8;
       +        *b = dc.col[x].color.blue >> 8;
       +
       +        return 0;
       +}
       +
       +int
        xsetcolorname(int x, const char *name)
        {
                Color ncolor;