|
@ -20,7 +20,7 @@ |
|
|
#include <X11/keysym.h> |
|
|
#include <X11/keysym.h> |
|
|
#include <X11/Xutil.h> |
|
|
#include <X11/Xutil.h> |
|
|
|
|
|
|
|
|
#define TNAME "xterm" |
|
|
|
|
|
|
|
|
#define TNAME "st-256color" |
|
|
|
|
|
|
|
|
/* Arbitrary sizes */ |
|
|
/* Arbitrary sizes */ |
|
|
#define ESC_TITLE_SIZ 256 |
|
|
#define ESC_TITLE_SIZ 256 |
|
@ -111,7 +111,7 @@ typedef struct { |
|
|
|
|
|
|
|
|
/* Drawing Context */ |
|
|
/* Drawing Context */ |
|
|
typedef struct { |
|
|
typedef struct { |
|
|
unsigned long col[LEN(colorname)]; |
|
|
|
|
|
|
|
|
unsigned long col[256]; |
|
|
XFontStruct* font; |
|
|
XFontStruct* font; |
|
|
XFontStruct* bfont; |
|
|
XFontStruct* bfont; |
|
|
GC gc; |
|
|
GC gc; |
|
@ -154,7 +154,6 @@ static void ttyread(void); |
|
|
static void ttyresize(int, int); |
|
|
static void ttyresize(int, int); |
|
|
static void ttywrite(const char *, size_t); |
|
|
static void ttywrite(const char *, size_t); |
|
|
|
|
|
|
|
|
static unsigned long xgetcol(const char *); |
|
|
|
|
|
static void xclear(int, int, int, int); |
|
|
static void xclear(int, int, int, int); |
|
|
static void xcursor(int); |
|
|
static void xcursor(int); |
|
|
static void xinit(void); |
|
|
static void xinit(void); |
|
@ -593,9 +592,31 @@ tsetattr(int *attr, int l) { |
|
|
case 27: |
|
|
case 27: |
|
|
term.c.attr.mode &= ~ATTR_REVERSE; |
|
|
term.c.attr.mode &= ~ATTR_REVERSE; |
|
|
break; |
|
|
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: |
|
|
case 39: |
|
|
term.c.attr.fg = DefaultFG; |
|
|
term.c.attr.fg = DefaultFG; |
|
|
break; |
|
|
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: |
|
|
case 49: |
|
|
term.c.attr.bg = DefaultBG; |
|
|
term.c.attr.bg = DefaultBG; |
|
|
break; |
|
|
break; |
|
@ -604,8 +625,12 @@ tsetattr(int *attr, int l) { |
|
|
term.c.attr.fg = attr[i] - 30; |
|
|
term.c.attr.fg = attr[i] - 30; |
|
|
else if(BETWEEN(attr[i], 40, 47)) |
|
|
else if(BETWEEN(attr[i], 40, 47)) |
|
|
term.c.attr.bg = attr[i] - 40; |
|
|
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 |
|
|
else |
|
|
fprintf(stderr, "erresc: gfx attr %d unkown\n", attr[i]); |
|
|
|
|
|
|
|
|
fprintf(stderr, "erresc: gfx attr %d unknown\n", attr[i]); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -1009,16 +1034,44 @@ tresize(int col, int row) { |
|
|
term.col = col, term.row = row; |
|
|
term.col = col, term.row = row; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
unsigned long |
|
|
|
|
|
xgetcol(const char *s) { |
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
tloadcols(void) { |
|
|
|
|
|
int i, r, g, b; |
|
|
XColor color; |
|
|
XColor color; |
|
|
Colormap cmap = DefaultColormap(xw.dis, xw.scr); |
|
|
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 |
|
|
void |
|
@ -1048,8 +1101,6 @@ xhints(void) |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
|
xinit(void) { |
|
|
xinit(void) { |
|
|
int i; |
|
|
|
|
|
|
|
|
|
|
|
xw.dis = XOpenDisplay(NULL); |
|
|
xw.dis = XOpenDisplay(NULL); |
|
|
xw.scr = XDefaultScreen(xw.dis); |
|
|
xw.scr = XDefaultScreen(xw.dis); |
|
|
if(!xw.dis) |
|
|
if(!xw.dis) |
|
@ -1064,8 +1115,7 @@ xinit(void) { |
|
|
xw.ch = dc.font->ascent + dc.font->descent; |
|
|
xw.ch = dc.font->ascent + dc.font->descent; |
|
|
|
|
|
|
|
|
/* colors */ |
|
|
/* colors */ |
|
|
for(i = 0; i < LEN(colorname); i++) |
|
|
|
|
|
dc.col[i] = xgetcol(colorname[i]); |
|
|
|
|
|
|
|
|
tloadcols(); |
|
|
|
|
|
|
|
|
term.c.attr.fg = DefaultFG; |
|
|
term.c.attr.fg = DefaultFG; |
|
|
term.c.attr.bg = DefaultBG; |
|
|
term.c.attr.bg = DefaultBG; |
|
@ -1173,6 +1223,8 @@ draw(int redraw_all) { |
|
|
Glyph base, new; |
|
|
Glyph base, new; |
|
|
char buf[DRAW_BUF_SIZ]; |
|
|
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++) { |
|
|
for(y = 0; y < term.row; y++) { |
|
|
base = term.line[y][0]; |
|
|
base = term.line[y][0]; |
|
|
i = ox = 0; |
|
|
i = ox = 0; |
|
|