URI: 
       Fixing color and refactor xsetcolorname. - st - simple terminal
  HTML git clone https://git.parazyd.org/st
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit c6fcb78b3a9a73b691875048848430c18870a0fc
   DIR parent 8b4cfcea73a37ab6d67c06c69e9af3de304185e3
  HTML Author: Christoph Lohmann <20h@r-36.net>
       Date:   Sun,  1 Jun 2014 17:08:16 +0200
       
       Fixing color and refactor xsetcolorname.
       
       By  the recommendation of FRIGN I refactored xsetcolorname to remove the
       unnecessary r, g, b variables when allocating a new  color.  Colors  are
       now freed and set to the new color. A die() should not happen here. Oth‐
       erwise it is easy for applications to kill st. St should be resilent  to
       malicious input.
       
       Second  this  patch  standardises  the  naming  of  »color«. There is no
       »colour« here. Maybe in some parts of the world.
       
       Diffstat:
         M st.c                                |      88 ++++++++++++++++++-------------
       
       1 file changed, 50 insertions(+), 38 deletions(-)
       ---
   DIR diff --git a/st.c b/st.c
       @@ -179,8 +179,8 @@ typedef unsigned long ulong;
        typedef unsigned short ushort;
        
        typedef XftDraw *Draw;
       -typedef XftColor Colour;
       -typedef Colormap Colourmap;
       +typedef XftColor Color;
       +typedef Colormap Colormap;
        
        typedef struct {
                char c[UTF_SIZ]; /* character code */
       @@ -241,7 +241,7 @@ typedef struct {
        /* Purely graphic info */
        typedef struct {
                Display *dpy;
       -        Colourmap cmap;
       +        Colormap cmap;
                Window win;
                Drawable buf;
                Atom xembed, wmdeletewin, netwmname, netwmpid;
       @@ -340,7 +340,7 @@ typedef struct {
        
        /* Drawing Context */
        typedef struct {
       -        Colour col[MAX(LEN(colorname), 256)];
       +        Color col[MAX(LEN(colorname), 256)];
                Font font, bfont, ifont, ibfont;
                GC gc;
        } DC;
       @@ -1631,7 +1631,7 @@ tdefcolor(int *attr, int *npar, int l) {
                uint r, g, b;
        
                switch (attr[*npar + 1]) {
       -        case 2: /* direct colour in RGB space */
       +        case 2: /* direct color in RGB space */
                        if (*npar + 4 >= l) {
                                fprintf(stderr,
                                        "erresc(38): Incorrect number of parameters (%d)\n",
       @@ -1648,7 +1648,7 @@ tdefcolor(int *attr, int *npar, int l) {
                        else
                                idx = TRUECOLOR(r, g, b);
                        break;
       -        case 5: /* indexed colour */
       +        case 5: /* indexed color */
                        if (*npar + 2 >= l) {
                                fprintf(stderr,
                                        "erresc(38): Incorrect number of parameters (%d)\n",
       @@ -1663,8 +1663,8 @@ tdefcolor(int *attr, int *npar, int l) {
                        break;
                case 0: /* implemented defined (only foreground) */
                case 1: /* transparent */
       -        case 3: /* direct colour in CMY space */
       -        case 4: /* direct colour in CMYK space */
       +        case 3: /* direct color in CMY space */
       +        case 4: /* direct color in CMYK space */
                default:
                        fprintf(stderr,
                                "erresc(38): gfx attr %d unknown\n", attr[*npar]);
       @@ -2151,7 +2151,7 @@ strhandle(void) {
                                /* FALLTHROUGH */
                        case 104: /* color reset, here p = NULL */
                                j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
       -                        if (!xsetcolorname(j, p)) {
       +                        if(xsetcolorname(j, p)) {
                                        fprintf(stderr, "erresc: invalid color %s\n", p);
                                } else {
                                        /*
       @@ -2720,14 +2720,14 @@ xloadcols(void) {
                int i;
                XRenderColor color = { .alpha = 0xffff };
                static bool loaded;
       -        Colour *cp;
       +        Color *cp;
        
                if(loaded) {
                        for (cp = dc.col; cp < dc.col + LEN(dc.col); ++cp)
                                XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);
                }
        
       -        /* load colours [0-15] and [256-LEN(colorname)] (config.h) */
       +        /* load colors [0-15] and [256-LEN(colorname)] (config.h) */
                for(i = 0; i < LEN(colorname); i++) {
                        if(!colorname[i])
                                continue;
       @@ -2736,7 +2736,7 @@ xloadcols(void) {
                        }
                }
        
       -        /* load colours [16-231] ; same colours as xterm */
       +        /* load colors [16-231] ; same colors as xterm */
                for(i = 16; i < 6*6*6+16; i++) {
                        color.red   = sixd_to_16bit( ((i-16)/36)%6 );
                        color.green = sixd_to_16bit( ((i-16)/6) %6 );
       @@ -2745,7 +2745,7 @@ xloadcols(void) {
                                die("Could not allocate color %d\n", i);
                }
        
       -        /* load colours [232-255] ; grayscale */
       +        /* load colors [232-255] ; grayscale */
                for(; i < 256; i++) {
                        color.red = color.green = color.blue = 0x0808 + 0x0a0a * (i-(6*6*6+16));
                        if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &dc.col[i]))
       @@ -2757,33 +2757,45 @@ xloadcols(void) {
        int
        xsetcolorname(int x, const char *name) {
                XRenderColor color = { .alpha = 0xffff };
       -        Colour colour;
       +        Color ncolor;
       +
                if(!BETWEEN(x, 0, LEN(colorname)))
       -                return -1;
       +                return 1;
       +
                if(!name) {
       -                if(BETWEEN(x, 16, 16 + 215)) {
       -                        int r = (x - 16) / 36, g = ((x - 16) % 36) / 6, b = (x - 16) % 6;
       -                        color.red = sixd_to_16bit(r);
       -                        color.green = sixd_to_16bit(g);
       -                        color.blue = sixd_to_16bit(b);
       -                        if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &colour))
       -                                return 0; /* something went wrong */
       -                        dc.col[x] = colour;
       -                        return 1;
       -                } else if(BETWEEN(x, 16 + 216, 255)) {
       -                        color.red = color.green = color.blue = 0x0808 + 0x0a0a * (x - (16 + 216));
       -                        if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &colour))
       -                                return 0; /* something went wrong */
       -                        dc.col[x] = colour;
       -                        return 1;
       -                } else {
       +                if(BETWEEN(x, 16, 16 + 215)) { /* 256 color */
       +                        color.red   = sixd_to_16bit( ((x-16)/36)%6 );
       +                        color.green = sixd_to_16bit( ((x-16)/6) %6 );
       +                        color.blue  = sixd_to_16bit( ((x-16)/1) %6 );
       +                        if(!XftColorAllocValue(xw.dpy, xw.vis,
       +                                                xw.cmap, &color, &ncolor)) {
       +                                return 1;
       +                        }
       +
       +                        XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
       +                        dc.col[x] = ncolor;
       +                        return 0;
       +                } else if(BETWEEN(x, 16 + 216, 255)) { /* greyscale */
       +                        color.red = color.green = color.blue = \
       +                                    0x0808 + 0x0a0a * (x - (16 + 216));
       +                        if(!XftColorAllocValue(xw.dpy, xw.vis,
       +                                                xw.cmap, &color, &ncolor)) {
       +                                return 1;
       +                        }
       +
       +                        XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
       +                        dc.col[x] = ncolor;
       +                        return 0;
       +                } else { /* system colors */
                                name = colorname[x];
                        }
                }
       -        if(!XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, &colour))
       -                return 0;
       -        dc.col[x] = colour;
       -        return 1;
       +        if(!XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, &ncolor))
       +                return 1;
       +
       +        XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]);
       +        dc.col[x] = ncolor;
       +        return 0;
        }
        
        void
       @@ -3099,7 +3111,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                FcPattern *fcpattern, *fontpattern;
                FcFontSet *fcsets[] = { NULL };
                FcCharSet *fccharset;
       -        Colour *fg, *bg, *temp, revfg, revbg, truefg, truebg;
       +        Color *fg, *bg, *temp, revfg, revbg, truefg, truebg;
                XRenderColor colfg, colbg;
                XRectangle r;
                int oneatatime;
       @@ -3145,8 +3157,8 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
        
                if(base.mode & ATTR_BOLD) {
                        /*
       -                 * change basic system colours [0-7]
       -                 * to bright system colours [8-15]
       +                 * change basic system colors [0-7]
       +                 * to bright system colors [8-15]
                         */
                        if(BETWEEN(base.fg, 0, 7))
                                fg = &dc.col[base.fg + 8];