diff options
Diffstat (limited to 'st.c')
| -rw-r--r--[-rwxr-xr-x] | st.c | 80 | 
1 files changed, 66 insertions, 14 deletions
@@ -20,7 +20,7 @@  #include <X11/keysym.h>  #include <X11/Xutil.h> -#define TNAME "xterm" +#define TNAME "st-256color"  /* Arbitrary sizes */  #define ESC_TITLE_SIZ 256 @@ -111,7 +111,7 @@ typedef struct {  /* Drawing Context */  typedef struct { -	unsigned long col[LEN(colorname)]; +	unsigned long col[256];  	XFontStruct* font;  	XFontStruct* bfont;  	GC gc; @@ -154,7 +154,6 @@ static void ttyread(void);  static void ttyresize(int, int);  static void ttywrite(const char *, size_t); -static unsigned long xgetcol(const char *);  static void xclear(int, int, int, int);  static void xcursor(int);  static void xinit(void); @@ -593,9 +592,31 @@ tsetattr(int *attr, int l) {  		case 27:   			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: gfx attr %d unknown\n", attr[i]);  +			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: gfx attr %d unknown\n", attr[i]);  +			break;  		case 49:  			term.c.attr.bg = DefaultBG;  			break; @@ -604,8 +625,12 @@ tsetattr(int *attr, int l) {  				term.c.attr.fg = attr[i] - 30;  			else if(BETWEEN(attr[i], 40, 47))  				term.c.attr.bg = attr[i] - 40; +			else if(BETWEEN(attr[i], 90, 97)) +				term.c.attr.fg = attr[i] - 90 + 8; +			else if(BETWEEN(attr[i], 100, 107)) +				term.c.attr.fg = attr[i] - 100 + 8;  			else  -				fprintf(stderr, "erresc: gfx attr %d unkown\n", attr[i]);  +				fprintf(stderr, "erresc: gfx attr %d unknown\n", attr[i]);   			break;  		}  	} @@ -1009,16 +1034,44 @@ tresize(int col, int row) {  	term.col = col, term.row = row;  } -unsigned long -xgetcol(const char *s) { +void +tloadcols(void) { +	int i, r, g, b;  	XColor color;  	Colormap cmap = DefaultColormap(xw.dis, xw.scr); +	unsigned long white = WhitePixel(xw.dis, xw.scr); + +	for(i = 0; i < 16; i++) { +		if (!XAllocNamedColor(xw.dis, cmap, colorname[i], &color, &color)) { +			dc.col[i] = white; +			fprintf(stderr, "Could not allocate color '%s'\n", colorname[i]); +		} else +			dc.col[i] = color.pixel; +	} + +	/* same colors as xterm */ +	for(r = 0; r < 6; r++) +		for(g = 0; g < 6; g++) +			for(b = 0; b < 6; b++) { +				color.red = r == 0 ? 0 : 0x3737 + 0x2828 * r; +				color.green = g == 0 ? 0 : 0x3737 + 0x2828 * g; +				color.blue = b == 0 ? 0 : 0x3737 + 0x2828 * b; +				if (!XAllocColor(xw.dis, cmap, &color)) { +					dc.col[i] = white; +					fprintf(stderr, "Could not allocate color %d\n", i); +				} else +					dc.col[i] = color.pixel; +				i++; +			} -	if(!XAllocNamedColor(xw.dis, cmap, s, &color, &color)) { -		color.pixel = WhitePixel(xw.dis, xw.scr); -		fprintf(stderr, "Could not allocate color '%s'\n", s); +	for(r = 0; r < 24; r++, i++) { +		color.red = color.green = color.blue = 0x0808 + 0x0a0a * r; +		if (!XAllocColor(xw.dis, cmap, &color)) { +			dc.col[i] = white; +			fprintf(stderr, "Could not allocate color %d\n", i); +		} else +			dc.col[i] = color.pixel;  	} -	return color.pixel;  }  void @@ -1048,8 +1101,6 @@ xhints(void)  void  xinit(void) { -	int i; -  	xw.dis = XOpenDisplay(NULL);  	xw.scr = XDefaultScreen(xw.dis);  	if(!xw.dis) @@ -1064,8 +1115,7 @@ xinit(void) {  	xw.ch = dc.font->ascent + dc.font->descent;  	/* colors */ -	for(i = 0; i < LEN(colorname); i++) -		dc.col[i] = xgetcol(colorname[i]); +	tloadcols();  	term.c.attr.fg = DefaultFG;  	term.c.attr.bg = DefaultBG; @@ -1173,6 +1223,8 @@ draw(int redraw_all) {  	Glyph base, new;  	char buf[DRAW_BUF_SIZ]; +	XSetForeground(xw.dis, dc.gc, dc.col[DefaultBG]); +	XFillRectangle(xw.dis, xw.buf, dc.gc, 0, 0, xw.w, xw.h);  	for(y = 0; y < term.row; y++) {  		base = term.line[y][0];  		i = ox = 0;  | 
