|
|
@ -104,6 +104,7 @@ typedef struct { |
|
|
|
/* Purely graphic info */ |
|
|
|
typedef struct { |
|
|
|
Display* dis; |
|
|
|
Colormap cmap; |
|
|
|
Window win; |
|
|
|
Pixmap buf; |
|
|
|
int scr; |
|
|
@ -1121,11 +1122,10 @@ void |
|
|
|
xloadcols(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)) { |
|
|
|
if (!XAllocNamedColor(xw.dis, xw.cmap, colorname[i], &color, &color)) { |
|
|
|
dc.col[i] = white; |
|
|
|
fprintf(stderr, "Could not allocate color '%s'\n", colorname[i]); |
|
|
|
} else |
|
|
@ -1139,7 +1139,7 @@ xloadcols(void) { |
|
|
|
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)) { |
|
|
|
if (!XAllocColor(xw.dis, xw.cmap, &color)) { |
|
|
|
dc.col[i] = white; |
|
|
|
fprintf(stderr, "Could not allocate color %d\n", i); |
|
|
|
} else |
|
|
@ -1149,7 +1149,7 @@ xloadcols(void) { |
|
|
|
|
|
|
|
for(r = 0; r < 24; r++, i++) { |
|
|
|
color.red = color.green = color.blue = 0x0808 + 0x0a0a * r; |
|
|
|
if (!XAllocColor(xw.dis, cmap, &color)) { |
|
|
|
if (!XAllocColor(xw.dis, xw.cmap, &color)) { |
|
|
|
dc.col[i] = white; |
|
|
|
fprintf(stderr, "Could not allocate color %d\n", i); |
|
|
|
} else |
|
|
@ -1184,6 +1184,8 @@ xhints(void) |
|
|
|
|
|
|
|
void |
|
|
|
xinit(void) { |
|
|
|
XSetWindowAttributes attrs; |
|
|
|
|
|
|
|
if(!(xw.dis = XOpenDisplay(NULL))) |
|
|
|
die("Can't open display\n"); |
|
|
|
xw.scr = XDefaultScreen(xw.dis); |
|
|
@ -1197,25 +1199,32 @@ xinit(void) { |
|
|
|
xw.ch = dc.font->ascent + dc.font->descent; |
|
|
|
|
|
|
|
/* colors */ |
|
|
|
xw.cmap = XDefaultColormap(xw.dis, xw.scr); |
|
|
|
xloadcols(); |
|
|
|
|
|
|
|
/* windows */ |
|
|
|
xw.bufh = term.row * xw.ch; |
|
|
|
xw.bufw = term.col * xw.cw; |
|
|
|
/* window - default size */ |
|
|
|
xw.bufh = 24 * xw.ch; |
|
|
|
xw.bufw = 80 * xw.cw; |
|
|
|
xw.h = xw.bufh + 2*BORDER; |
|
|
|
xw.w = xw.bufw + 2*BORDER; |
|
|
|
xw.win = XCreateSimpleWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0, |
|
|
|
xw.w, xw.h, 0, |
|
|
|
dc.col[DefaultBG], |
|
|
|
dc.col[DefaultBG]); |
|
|
|
|
|
|
|
attrs.background_pixel = dc.col[DefaultBG]; |
|
|
|
attrs.border_pixel = dc.col[DefaultBG]; |
|
|
|
attrs.bit_gravity = NorthWestGravity; |
|
|
|
attrs.event_mask = ExposureMask | KeyPressMask |
|
|
|
| StructureNotifyMask | FocusChangeMask | PointerMotionMask |
|
|
|
| ButtonPressMask | ButtonReleaseMask; |
|
|
|
attrs.colormap = xw.cmap; |
|
|
|
|
|
|
|
xw.win = XCreateWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0, |
|
|
|
xw.w, xw.h, 0, XDefaultDepth(xw.dis, xw.scr), InputOutput, |
|
|
|
XDefaultVisual(xw.dis, xw.scr), |
|
|
|
CWBackPixel | CWBorderPixel | CWBitGravity | CWEventMask |
|
|
|
| CWColormap, |
|
|
|
&attrs); |
|
|
|
xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); |
|
|
|
/* gc */ |
|
|
|
dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL); |
|
|
|
|
|
|
|
/* event mask */ |
|
|
|
XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask |
|
|
|
| StructureNotifyMask | FocusChangeMask | PointerMotionMask |
|
|
|
| ButtonPressMask | ButtonReleaseMask); |
|
|
|
|
|
|
|
XMapWindow(xw.dis, xw.win); |
|
|
|
xhints(); |
|
|
@ -1432,7 +1441,6 @@ resize(XEvent *e) { |
|
|
|
xw.bufw = MAX(1, xw.bufw); |
|
|
|
XFreePixmap(xw.dis, xw.buf); |
|
|
|
xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); |
|
|
|
draw(SCREEN_REDRAW); |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|