--- st.c | 124 +++++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 84 insertions(+), 40 deletions(-) diff --git a/st.c b/st.c index 947373f..3f693d9 100644 --- a/st.c +++ b/st.c _AT_@ -306,7 +306,7 @@ typedef struct { /* Drawing Context */ typedef struct { - Colour col[LEN(colorname) < 256 ? 256 : LEN(colorname)]; + Colour *col; Font font, bfont, ifont, ibfont; GC gc; } DC; _AT_@ -354,7 +354,7 @@ static void tsetdirtattr(int); static void tsetmode(bool, bool, int *, int); static void tfulldirt(void); static void techo(char *, int); - +static int tdefcolor(int *, int *, int); static inline bool match(uint, uint); static void ttynew(void); static void ttyread(void); _AT_@ -366,6 +366,8 @@ static void xhints(void); static void xclear(int, int, int, int); static void xdrawcursor(void); static void xinit(void); + +static int xnewcolor(uint, uint, uint); static void xloadcols(void); static int xsetcolorname(int, const char *); static int xloadfont(Font *, FcPattern *); _AT_@ -451,6 +453,7 @@ static int oldbutton = 3; /* button event on startup: 3 = release */ static char *usedfont = NULL; static int usedfontsize = 0; +static size_t numcolours; /* Font Ring Cache */ enum { _AT_@ -1618,9 +1621,57 @@ tdeleteline(int n) { tscrollup(term.c.y, n); } +int +tdefcolor(int *attr, int *npar, int l) { + int idx = -1; + uint r, g, b; + + switch (attr[*npar + 1]) { + case 2: /* direct colour in RGB space */ + if (*npar + 4 >= l) { + fprintf(stderr, + "erresc(38): Incorrect number of parameters (%d)\n", + *npar); + break; + } + r = attr[*npar + 2]; + g = attr[*npar + 3]; + b = attr[*npar + 4]; + *npar += 4; + if(!BETWEEN(r, 0, 255) || !BETWEEN(g, 0, 255) || !BETWEEN(b, 0, 255)) + fprintf(stderr, "erresc: bad rgb color (%d,%d,%d)\n", + r, g, b); + else + idx = xnewcolor(r, g, b); + break; + case 5: /* indexed colour */ + if (*npar + 2 >= l) { + fprintf(stderr, + "erresc(38): Incorrect number of parameters (%d)\n", + *npar); + break; + } + *npar += 2; + if(!BETWEEN(attr[*npar], 0, 255)) + fprintf(stderr, "erresc: bad fgcolor %d\n", attr[*npar]); + else + idx = attr[*npar]; + break; + case 0: /* implemented defined (only foreground) */ + case 1: /* transparent */ + case 3: /* direct colour in CMY space */ + case 4: /* direct colour in CMYK space */ + default: + fprintf(stderr, + "erresc(38): gfx attr %d unknown\n", attr[*npar]); + } + + return idx; +} + void tsetattr(int *attr, int l) { - int i; + int i, idx; for(i = 0; i < l; i++) { switch(attr[i]) { _AT_@ -1665,39 +1716,15 @@ tsetattr(int *attr, int l) { term.c.attr.mode &= ~ATTR_REVERSE; break; case 38: - if(i + 2 < l && attr[i + 1] == 5) { - i += 2; - if(BETWEEN(attr[i], 0, 255)) { - term.c.attr.fg = attr[i]; - } else { - fprintf(stderr, - "erresc: bad fgcolor %d\n", - attr[i]); - } - } else { - fprintf(stderr, - "erresc(38): gfx attr %d unknown\n", - attr[i]); - } + if ((idx = tdefcolor(attr, &i, l)) >= 0) + term.c.attr.fg = idx; break; case 39: term.c.attr.fg = defaultfg; break; case 48: - if(i + 2 < l && attr[i + 1] == 5) { - i += 2; - if(BETWEEN(attr[i], 0, 255)) { - term.c.attr.bg = attr[i]; - } else { - fprintf(stderr, - "erresc: bad bgcolor %d\n", - attr[i]); - } - } else { - fprintf(stderr, - "erresc(48): gfx attr %d unknown\n", - attr[i]); - } + if ((idx = tdefcolor(attr, &i, l)) >= 0) + term.c.attr.bg = idx; break; case 49: term.c.attr.bg = defaultbg; _AT_@ -2396,6 +2423,7 @@ tputc(char *c, int len) { treset(); term.esc = 0; xresettitle(); + xloadcols(); break; case '=': /* DECPAM -- Application keypad */ term.mode |= MODE_APPKEYPAD; _AT_@ -2553,41 +2581,57 @@ sixd_to_16bit(int x) { return x == 0 ? 0 : 0x3737 + 0x2828 * x; } +int +xnewcolor(uint r, uint g, uint b) { + XRenderColor color = { .alpha = 0xffff }; + + dc.col = xrealloc(dc.col, (numcolours+1) * sizeof(*dc.col)); + color.red = r << 8; + color.green = g << 8; + color.blue = b << 8; + if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &dc.col[numcolours])) + die("Could not allocate color %d\n", numcolours); + return numcolours++; +} + void xloadcols(void) { int i, r, g, b; XRenderColor color = { .alpha = 0xffff }; + Colour *cp; + + for (cp = dc.col; cp < dc.col + numcolours; ++cp) + XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); + + free(dc.col); + numcolours = LEN(colorname) < 256 ? 256 : LEN(colorname); + dc.col = xmalloc(numcolours * sizeof(*dc.col)); /* load colors [0-15] colors and [256-LEN(colorname)[ (config.h) */ for(i = 0; i < LEN(colorname); i++) { if(!colorname[i]) continue; - if(!XftColorAllocName(xw.dpy, xw.vis, xw.cmap, colorname[i], &dc.col[i])) { + if(!XftColorAllocName(xw.dpy, xw.vis, xw.cmap, colorname[i], &dc.col[i])) die("Could not allocate color '%s'\n", colorname[i]); - } } /* load colors [16-255] ; same colors as xterm */ for(i = 16, r = 0; r < 6; r++) { for(g = 0; g < 6; g++) { - for(b = 0; b < 6; b++) { + for(b = 0; b < 6; b++, i++) { 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, &dc.col[i])) { + if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &dc.col[i])) die("Could not allocate color %d\n", i); - } - i++; } } } for(r = 0; r < 24; r++, i++) { color.red = color.green = color.blue = 0x0808 + 0x0a0a * r; - if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, - &dc.col[i])) { + if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &dc.col[i])) die("Could not allocate color %d\n", i); - } } } -- 1.8.3.2Received on Fri Jul 19 2013 - 20:51:33 CEST
This archive was generated by hypermail 2.3.0 : Fri Jul 19 2013 - 21:00:06 CEST