diff options
| -rw-r--r-- | st.c | 42 |
1 files changed, 25 insertions, 17 deletions
| @@ -104,6 +104,7 @@ typedef struct { | |||
| 104 | /* Purely graphic info */ | 104 | /* Purely graphic info */ |
| 105 | typedef struct { | 105 | typedef struct { |
| 106 | Display* dis; | 106 | Display* dis; |
| 107 | Colormap cmap; | ||
| 107 | Window win; | 108 | Window win; |
| 108 | Pixmap buf; | 109 | Pixmap buf; |
| 109 | int scr; | 110 | int scr; |
| @@ -1121,11 +1122,10 @@ void | |||
| 1121 | xloadcols(void) { | 1122 | xloadcols(void) { |
| 1122 | int i, r, g, b; | 1123 | int i, r, g, b; |
| 1123 | XColor color; | 1124 | XColor color; |
| 1124 | Colormap cmap = DefaultColormap(xw.dis, xw.scr); | ||
| 1125 | unsigned long white = WhitePixel(xw.dis, xw.scr); | 1125 | unsigned long white = WhitePixel(xw.dis, xw.scr); |
| 1126 | 1126 | ||
| 1127 | for(i = 0; i < 16; i++) { | 1127 | for(i = 0; i < 16; i++) { |
| 1128 | if (!XAllocNamedColor(xw.dis, cmap, colorname[i], &color, &color)) { | 1128 | if (!XAllocNamedColor(xw.dis, xw.cmap, colorname[i], &color, &color)) { |
| 1129 | dc.col[i] = white; | 1129 | dc.col[i] = white; |
| 1130 | fprintf(stderr, "Could not allocate color '%s'\n", colorname[i]); | 1130 | fprintf(stderr, "Could not allocate color '%s'\n", colorname[i]); |
| 1131 | } else | 1131 | } else |
| @@ -1139,7 +1139,7 @@ xloadcols(void) { | |||
| 1139 | color.red = r == 0 ? 0 : 0x3737 + 0x2828 * r; | 1139 | color.red = r == 0 ? 0 : 0x3737 + 0x2828 * r; |
| 1140 | color.green = g == 0 ? 0 : 0x3737 + 0x2828 * g; | 1140 | color.green = g == 0 ? 0 : 0x3737 + 0x2828 * g; |
| 1141 | color.blue = b == 0 ? 0 : 0x3737 + 0x2828 * b; | 1141 | color.blue = b == 0 ? 0 : 0x3737 + 0x2828 * b; |
| 1142 | if (!XAllocColor(xw.dis, cmap, &color)) { | 1142 | if (!XAllocColor(xw.dis, xw.cmap, &color)) { |
| 1143 | dc.col[i] = white; | 1143 | dc.col[i] = white; |
| 1144 | fprintf(stderr, "Could not allocate color %d\n", i); | 1144 | fprintf(stderr, "Could not allocate color %d\n", i); |
| 1145 | } else | 1145 | } else |
| @@ -1149,7 +1149,7 @@ xloadcols(void) { | |||
| 1149 | 1149 | ||
| 1150 | for(r = 0; r < 24; r++, i++) { | 1150 | for(r = 0; r < 24; r++, i++) { |
| 1151 | color.red = color.green = color.blue = 0x0808 + 0x0a0a * r; | 1151 | color.red = color.green = color.blue = 0x0808 + 0x0a0a * r; |
| 1152 | if (!XAllocColor(xw.dis, cmap, &color)) { | 1152 | if (!XAllocColor(xw.dis, xw.cmap, &color)) { |
| 1153 | dc.col[i] = white; | 1153 | dc.col[i] = white; |
| 1154 | fprintf(stderr, "Could not allocate color %d\n", i); | 1154 | fprintf(stderr, "Could not allocate color %d\n", i); |
| 1155 | } else | 1155 | } else |
| @@ -1184,6 +1184,8 @@ xhints(void) | |||
| 1184 | 1184 | ||
| 1185 | void | 1185 | void |
| 1186 | xinit(void) { | 1186 | xinit(void) { |
| 1187 | XSetWindowAttributes attrs; | ||
| 1188 | |||
| 1187 | if(!(xw.dis = XOpenDisplay(NULL))) | 1189 | if(!(xw.dis = XOpenDisplay(NULL))) |
| 1188 | die("Can't open display\n"); | 1190 | die("Can't open display\n"); |
| 1189 | xw.scr = XDefaultScreen(xw.dis); | 1191 | xw.scr = XDefaultScreen(xw.dis); |
| @@ -1197,25 +1199,32 @@ xinit(void) { | |||
| 1197 | xw.ch = dc.font->ascent + dc.font->descent; | 1199 | xw.ch = dc.font->ascent + dc.font->descent; |
| 1198 | 1200 | ||
| 1199 | /* colors */ | 1201 | /* colors */ |
| 1202 | xw.cmap = XDefaultColormap(xw.dis, xw.scr); | ||
| 1200 | xloadcols(); | 1203 | xloadcols(); |
| 1201 | 1204 | ||
| 1202 | /* windows */ | 1205 | /* window - default size */ |
| 1203 | xw.bufh = term.row * xw.ch; | 1206 | xw.bufh = 24 * xw.ch; |
| 1204 | xw.bufw = term.col * xw.cw; | 1207 | xw.bufw = 80 * xw.cw; |
| 1205 | xw.h = xw.bufh + 2*BORDER; | 1208 | xw.h = xw.bufh + 2*BORDER; |
| 1206 | xw.w = xw.bufw + 2*BORDER; | 1209 | xw.w = xw.bufw + 2*BORDER; |
| 1207 | xw.win = XCreateSimpleWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0, | 1210 | |
| 1208 | xw.w, xw.h, 0, | 1211 | attrs.background_pixel = dc.col[DefaultBG]; |
| 1209 | dc.col[DefaultBG], | 1212 | attrs.border_pixel = dc.col[DefaultBG]; |
| 1210 | dc.col[DefaultBG]); | 1213 | attrs.bit_gravity = NorthWestGravity; |
| 1214 | attrs.event_mask = ExposureMask | KeyPressMask | ||
| 1215 | | StructureNotifyMask | FocusChangeMask | PointerMotionMask | ||
| 1216 | | ButtonPressMask | ButtonReleaseMask; | ||
| 1217 | attrs.colormap = xw.cmap; | ||
| 1218 | |||
| 1219 | xw.win = XCreateWindow(xw.dis, XRootWindow(xw.dis, xw.scr), 0, 0, | ||
| 1220 | xw.w, xw.h, 0, XDefaultDepth(xw.dis, xw.scr), InputOutput, | ||
| 1221 | XDefaultVisual(xw.dis, xw.scr), | ||
| 1222 | CWBackPixel | CWBorderPixel | CWBitGravity | CWEventMask | ||
| 1223 | | CWColormap, | ||
| 1224 | &attrs); | ||
| 1211 | xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); | 1225 | xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); |
| 1212 | /* gc */ | 1226 | /* gc */ |
| 1213 | dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL); | 1227 | dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL); |
| 1214 | |||
| 1215 | /* event mask */ | ||
| 1216 | XSelectInput(xw.dis, xw.win, ExposureMask | KeyPressMask | ||
| 1217 | | StructureNotifyMask | FocusChangeMask | PointerMotionMask | ||
| 1218 | | ButtonPressMask | ButtonReleaseMask); | ||
| 1219 | 1228 | ||
| 1220 | XMapWindow(xw.dis, xw.win); | 1229 | XMapWindow(xw.dis, xw.win); |
| 1221 | xhints(); | 1230 | xhints(); |
| @@ -1432,7 +1441,6 @@ resize(XEvent *e) { | |||
| 1432 | xw.bufw = MAX(1, xw.bufw); | 1441 | xw.bufw = MAX(1, xw.bufw); |
| 1433 | XFreePixmap(xw.dis, xw.buf); | 1442 | XFreePixmap(xw.dis, xw.buf); |
| 1434 | xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); | 1443 | xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr)); |
| 1435 | draw(SCREEN_REDRAW); | ||
| 1436 | } | 1444 | } |
| 1437 | 1445 | ||
| 1438 | void | 1446 | void |
