|
|
1.1 root 1: /* This file contains code for X-CHESS.
2: Copyright (C) 1986 Free Software Foundation, Inc.
3:
4: This file is part of X-CHESS.
5:
6: X-CHESS is distributed in the hope that it will be useful,
7: but WITHOUT ANY WARRANTY. No author or distributor
8: accepts responsibility to anyone for the consequences of using it
9: or for whether it serves any particular purpose or works at all,
10: unless he says so in writing. Refer to the X-CHESS General Public
11: License for full details.
12:
13: Everyone is granted permission to copy, modify and redistribute
14: X-CHESS, but only under the conditions described in the
15: X-CHESS General Public License. A copy of this license is
16: supposed to have been given to you along with X-CHESS so you
17: can know your rights and responsibilities. It should be in a
18: file named COPYING. Among other things, the copyright notice
19: and this notice must be preserved on all copies. */
20:
21:
22: /* RCS Info: $Revision: 1.5 $ on $Date: 86/11/26 12:11:15 $
23: * $Source: /users/faustus/xchess/RCS/window.c,v $
24: * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group
25: * Permission is granted to do anything with this code except sell it
26: * or remove this message.
27: *
28: * Deal with the two (or one) windows.
29: */
30:
31: #include "xchess.h"
32: #include <X11/Xutil.h>
33: #include <sys/time.h>
34:
35: #include "pawn.bitmap"
36: #include "rook.bitmap"
37: #include "knight.bitmap"
38: #include "bishop.bitmap"
39: #include "queen.bitmap"
40: #include "king.bitmap"
41:
42: #include "pawn_outline.bitmap"
43: #include "rook_outline.bitmap"
44: #include "knight_outline.bitmap"
45: #include "bishop_outline.bitmap"
46: #include "queen_outline.bitmap"
47: #include "king_outline.bitmap"
48:
49: #include "pawn_mask.bitmap"
50: #include "rook_mask.bitmap"
51: #include "knight_mask.bitmap"
52: #include "bishop_mask.bitmap"
53: #include "queen_mask.bitmap"
54: #include "king_mask.bitmap"
55:
56: #include "shade.bitmap"
57:
58: #include "xchess.cur"
59: #include "xchess_mask.cur"
60:
61: #include "xchess.icon"
62:
63: windata *win1, *win2;
64: bool win_flashmove = false;
65:
66: extern bool setup();
67: extern void service(), drawgrid(), icon_refresh();
68:
69: bool
70: win_setup(disp1, disp2)
71: char *disp1, *disp2;
72: {
73: win1 = alloc(windata);
74: if (!oneboard)
75: win2 = alloc(windata);
76:
77: if (!setup(disp1, win1) || (!oneboard && !setup(disp2, win2)))
78: return (false);
79:
80: if (blackflag) {
81: win1->color = BLACK;
82: win1->flipped = true;
83: } else
84: win1->color = WHITE;
85: win_drawboard(win1);
86:
87: if (!oneboard) {
88: win2->color = BLACK;
89: win2->flipped = true;
90: win_drawboard(win2);
91: }
92:
93: return(true);
94: }
95:
96: /* Draw the chess board... */
97:
98: void
99: win_drawboard(win)
100: windata *win;
101: {
102: int i, j;
103:
104: drawgrid(win);
105:
106: /* Now toss on the squares... */
107: for (i = 0; i < SIZE; i++)
108: for (j = 0; j < SIZE; j++)
109: win_erasepiece(j, i, win->color);
110:
111: return;
112: }
113:
114: /* Draw one piece. */
115:
116: void
117: win_drawpiece(p, y, x, wnum)
118: piece *p;
119: int y, x;
120: color wnum;
121: {
122: char *bits, *maskbits, *outline;
123: windata *win;
124: char buf[BSIZE];
125: XImage *tmpImage;
126: Pixmap tmpPM, maskPM;
127: XGCValues gc;
128:
129: if (oneboard || (wnum == win1->color))
130: win = win1;
131: else
132: win = win2;
133:
134: if (win->flipped) {
135: y = SIZE - y - 1;
136: x = SIZE - x - 1;
137: }
138:
139: /*
140: if (debug)
141: fprintf(stderr, "draw a %s at (%d, %d) on board %d\n",
142: piecenames[(int) p->type], y, x, wnum);
143: */
144:
145: if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) exit(1);
146:
147: switch (p->type) {
148: case PAWN:
149: bits = pawn_bits;
150: maskbits = pawn_mask_bits;
151: outline = pawn_outline_bits;
152: break;
153:
154: case ROOK:
155: bits = rook_bits;
156: maskbits = rook_mask_bits;
157: outline = rook_outline_bits;
158: break;
159:
160: case KNIGHT:
161: bits = knight_bits;
162: maskbits = knight_mask_bits;
163: outline = knight_outline_bits;
164: break;
165:
166: case BISHOP:
167: bits = bishop_bits;
168: maskbits = bishop_mask_bits;
169: outline = bishop_outline_bits;
170: break;
171:
172: case QUEEN:
173: bits = queen_bits;
174: maskbits = queen_mask_bits;
175: outline = queen_outline_bits;
176: break;
177:
178: case KING:
179: bits = king_bits;
180: maskbits = king_mask_bits;
181: outline = king_outline_bits;
182: break;
183:
184: default:
185: fprintf(stderr,
186: "Internal Error: win_drawpiece: bad piece type %d\n",
187: p->type);
188: }
189:
190: /* There are two things we can do... If this is a black and white
191: * display, we have to shade the square and use an outline if the piece
192: * is white. We also have to use a mask... Since we don't want
193: * to use up too many bitmaps, create the mask bitmap, put the bits,
194: * and then destroy it.
195: */
196: if (win->bnw && (p->color == WHITE))
197: bits = outline;
198: if (win->bnw && !iswhite(win, x, y)) {
199: XSetState(win->display, DefaultGC(win->display, 0),
200: BlackPixel(win->display, 0),
201: WhitePixel(win->display, 0), GXcopy, AllPlanes);
202:
203: tmpPM = XCreateBitmapFromData(win->display, win->boardwin,
204: shade_bits, SQUARE_WIDTH, SQUARE_HEIGHT);
205:
206: XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0),
207: 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT,
208: x * (SQUARE_WIDTH + BORDER_WIDTH),
209: y * (SQUARE_HEIGHT + BORDER_WIDTH), 1);
210:
211: XFreePixmap(win->display, tmpPM);
212:
213: XSetFunction(win->display, DefaultGC(win->display, 0),
214: GXandInverted);
215: maskPM = XCreateBitmapFromData(win->display, win->boardwin,
216: maskbits, SQUARE_WIDTH, SQUARE_HEIGHT);
217: XCopyPlane(win->display, maskPM, win->boardwin, DefaultGC(win->display, 0),
218: 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT,
219: x * (SQUARE_WIDTH + BORDER_WIDTH),
220: y * (SQUARE_HEIGHT + BORDER_WIDTH), 1);
221: XFreePixmap(win->display, maskPM);
222:
223: XSetFunction(win->display, DefaultGC(win->display, 0),
224: GXor);
225: tmpPM = XCreateBitmapFromData(win->display, win->boardwin,
226: bits, SQUARE_WIDTH, SQUARE_HEIGHT);
227: XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0),
228: 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT,
229: x * (SQUARE_WIDTH + BORDER_WIDTH),
230: y * (SQUARE_HEIGHT + BORDER_WIDTH), 1);
231: XFreePixmap(win->display, tmpPM);
232:
233: XSetFunction(win->display, DefaultGC(win->display, 0), GXcopy);
234:
235: } else if (win->bnw){
236: XSetState(win->display, DefaultGC(win->display, 0),
237: BlackPixel(win->display, 0),
238: WhitePixel(win->display, 0), GXcopy, AllPlanes);
239:
240: tmpPM = XCreateBitmapFromData(win->display, win->boardwin,
241: bits, SQUARE_WIDTH, SQUARE_HEIGHT);
242: XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0),
243: 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT,
244: x * (SQUARE_WIDTH + BORDER_WIDTH),
245: y * (SQUARE_HEIGHT + BORDER_WIDTH), 1);
246: XFreePixmap(win->display, tmpPM);
247: } else {
248: XSetState(win->display, DefaultGC(win->display, 0),
249: ((p->color == WHITE) ? win->whitepiece.pixel :
250: win->blackpiece.pixel),
251: (iswhite(win, x, y) ? win->whitesquare.pixel :
252: win->blacksquare.pixel),
253: GXcopy, AllPlanes);
254: tmpPM = XCreateBitmapFromData(win->display, win->boardwin,
255: bits, SQUARE_WIDTH, SQUARE_HEIGHT);
256: XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0),
257: 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT,
258: x * (SQUARE_WIDTH + BORDER_WIDTH),
259: y * (SQUARE_HEIGHT + BORDER_WIDTH), 1);
260: XFreePixmap(win->display, tmpPM);
261: }
262:
263: if (!record_english) {
264: gc.foreground = win->textcolor.pixel;
265: if (iswhite(win, x, y) || win->bnw)
266: gc.background = win->whitesquare.pixel;
267: else
268: gc.background = win->blacksquare.pixel;
269:
270: gc.font = win->small->fid;
271:
272: XChangeGC(win->display, DefaultGC(win->display, 0),
273: GCForeground | GCBackground | GCFont, &gc);
274:
275: if (!x) {
276: sprintf(buf, " %d", SIZE - y);
277: XDrawImageString(win->display, win->boardwin,
278: DefaultGC(win->display, 0),
279: 1, (y + 1) * (SQUARE_HEIGHT +
280: BORDER_WIDTH) - BORDER_WIDTH +
281: win->small->max_bounds.ascent - 1, buf, 2);
282: }
283: if (y == SIZE - 1) {
284: sprintf(buf, "%c", 'A' + x);
285: XDrawImageString(win->display, win->boardwin,
286: DefaultGC(win->display, 0),
287: x * (SQUARE_WIDTH + BORDER_WIDTH) + 1,
288: SIZE * (SQUARE_HEIGHT + BORDER_WIDTH) - BORDER_WIDTH +
289: win->small->max_bounds.ascent - 1, buf, 1);
290: }
291: }
292: return;
293: }
294:
295: void
296: win_erasepiece(y, x, wnum)
297: int y, x;
298: color wnum;
299: {
300: windata *win;
301: char buf[BSIZE];
302: XGCValues gc;
303: Pixmap tmpPM;
304:
305: if (oneboard || (wnum == win1->color))
306: win = win1;
307: else
308: win = win2;
309:
310: if (win->flipped) {
311: y = SIZE - y - 1;
312: x = SIZE - x - 1;
313: }
314:
315: /*
316: if (debug)
317: fprintf(stderr, "erase square (%d, %d) on board %d\n", y, x,
318: wnum);
319: */
320:
321: if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) exit(1);
322:
323: if (win->bnw && !iswhite(win, x, y)) {
324: XSetState(win->display, DefaultGC(win->display, 0),
325: BlackPixel(win->display, 0),
326: WhitePixel(win->display, 0), GXcopy, AllPlanes);
327: tmpPM = XCreateBitmapFromData(win->display, win->boardwin,
328: shade_bits, SQUARE_WIDTH, SQUARE_HEIGHT);
329:
330: XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0),
331: 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT,
332: x * (SQUARE_WIDTH + BORDER_WIDTH),
333: y * (SQUARE_HEIGHT + BORDER_WIDTH), 1);
334:
335: XFreePixmap(win->display, tmpPM);
336: } else {
337: XSetFillStyle(win->display, DefaultGC(win->display, 0),
338: FillSolid);
339: XSetForeground(win->display, DefaultGC(win->display, 0),
340: iswhite(win, x, y) ? win->whitesquare.pixel :
341: win->blacksquare.pixel);
342: XFillRectangle(win->display, win->boardwin,
343: DefaultGC(win->display, 0),
344: x * (SQUARE_WIDTH + BORDER_WIDTH),
345: y * (SQUARE_HEIGHT + BORDER_WIDTH),
346: SQUARE_WIDTH, SQUARE_HEIGHT);
347: }
348:
349: if (!record_english) {
350: gc.foreground = win->textcolor.pixel;
351: if (iswhite(win, x, y) || win->bnw)
352: gc.background = win->whitesquare.pixel;
353: else
354: gc.background = win->blacksquare.pixel;
355:
356: gc.font = win->small->fid;
357:
358: XChangeGC(win->display, DefaultGC(win->display, 0),
359: GCForeground | GCBackground | GCFont, &gc);
360:
361: if (!x) {
362: sprintf(buf, " %d", SIZE - y);
363: XDrawImageString(win->display, win->boardwin,
364: DefaultGC(win->display, 0),
365: 1, (y + 1) * (SQUARE_HEIGHT +
366: BORDER_WIDTH) - BORDER_WIDTH +
367: win->small->max_bounds.ascent - 1, buf, 2);
368: }
369: if (y == SIZE - 1) {
370: sprintf(buf, "%c", 'A' + x);
371: XDrawImageString(win->display, win->boardwin,
372: DefaultGC(win->display, 0),
373: x * (SQUARE_WIDTH + BORDER_WIDTH) + 1,
374: SIZE * (SQUARE_HEIGHT + BORDER_WIDTH) - BORDER_WIDTH +
375: win->small->max_bounds.ascent - 1, buf, 1);
376: }
377: }
378:
379:
380: return;
381: }
382:
383: void
384: win_flash(m, wnum)
385: move *m;
386: color wnum;
387: {
388: windata *win;
389: int sx, sy, ex, ey, i;
390:
391: if (oneboard || (wnum == win1->color))
392: win = win1;
393: else
394: win = win2;
395:
396: if (win->flipped) {
397: sx = SIZE - m->fromx - 1;
398: sy = SIZE - m->fromy - 1;
399: ex = SIZE - m->tox - 1;
400: ey = SIZE - m->toy - 1;
401: } else {
402: sx = m->fromx;
403: sy = m->fromy;
404: ex = m->tox;
405: ey = m->toy;
406: }
407: sx = sx * (SQUARE_WIDTH + BORDER_WIDTH) + SQUARE_WIDTH / 2;
408: sy = sy * (SQUARE_HEIGHT + BORDER_WIDTH) + SQUARE_HEIGHT / 2;
409: ex = ex * (SQUARE_WIDTH + BORDER_WIDTH) + SQUARE_WIDTH / 2;
410: ey = ey * (SQUARE_HEIGHT + BORDER_WIDTH) + SQUARE_HEIGHT / 2;
411:
412: XSetFunction(win->display, DefaultGC(win->display, 0), GXinvert);
413: XSetLineAttributes(win->display, DefaultGC(win->display, 0),
414: 0, LineSolid, 0, 0);
415: for (i = 0; i < num_flashes * 2; i++) {
416: XDrawLine(win->display,win->boardwin,
417: DefaultGC(win->display, 0),
418: sx, sy, ex, ey);
419: }
420:
421: XSetFunction(win->display, DefaultGC(win->display, 0), GXcopy);
422: return;
423: }
424:
425: /* Handle input from the players. */
426:
427: void
428: win_process(quick)
429: bool quick;
430: {
431: int i, rfd = 0, wfd = 0, xfd = 0;
432: struct timeval timeout;
433:
434: timeout.tv_sec = 0;
435: timeout.tv_usec = (quick ? 0 : 500000);
436:
437: if (XPending(win1->display))
438: service(win1);
439: if (!oneboard) {
440: if (XPending(win1->display))
441: service(win2);
442: }
443:
444: if (oneboard)
445: rfd = 1 << win1->display->fd;
446: else
447: rfd = (1 << win1->display->fd) | (1 << win2->display->fd);
448: if (!(i = select(32, &rfd, &wfd, &xfd, &timeout)))
449: return;
450: if (i == -1) {
451: perror("select");
452: exit(1);
453: }
454: if (rfd & (1 << win1->display->fd))
455: service(win1);
456: if (!oneboard && (rfd & (1 << win2->display->fd)))
457: service(win2);
458:
459: return;
460: }
461:
462: static void
463: service(win)
464: windata *win;
465: {
466: XEvent ev;
467:
468: while(XPending(win->display)) {
469: XNextEvent(win->display, &ev);
470: if (TxtFilter(win->display, &ev))
471: continue;
472:
473: if (ev.xany.window == win->boardwin) {
474: switch (ev.type) {
475: case ButtonPress:
476: button_pressed(&ev, win);
477: break;
478:
479: case ButtonRelease:
480: button_released(&ev, win);
481: break;
482:
483: case Expose:
484: /* Redraw... */
485: win_redraw(win, &ev);
486: break;
487:
488: case 0:
489: case NoExpose:
490: break;
491: default:
492: fprintf(stderr, "Bad event type %d\n", ev.type);
493: exit(1);
494: }
495: } else if (ev.xany.window == win->wclockwin) {
496: switch (ev.type) {
497: case Expose:
498: clock_draw(win, WHITE);
499: break;
500:
501: case 0:
502: case NoExpose:
503: break;
504: default:
505: fprintf(stderr, "Bad event type %d\n", ev.type);
506: exit(1);
507: }
508: } else if (ev.xany.window == win->bclockwin) {
509: switch (ev.type) {
510: case Expose:
511: clock_draw(win, BLACK);
512: break;
513:
514: case 0:
515: case NoExpose:
516: break;
517: default:
518: fprintf(stderr, "Bad event type %d\n", ev.type);
519: exit(1);
520: }
521: } else if (ev.xany.window == win->jailwin) {
522: switch (ev.type) {
523: case Expose:
524: jail_draw(win);
525: break;
526:
527: case 0:
528: case NoExpose:
529: break;
530: default:
531: fprintf(stderr, "Bad event type %d\n", ev.type);
532: exit(1);
533: }
534: } else if (ev.xany.window == win->buttonwin) {
535: switch (ev.type) {
536: case ButtonPress:
537: button_service(win, &ev);
538: break;
539:
540: case Expose:
541: button_draw(win);
542: break;
543:
544: case 0:
545: case NoExpose:
546: break;
547: default:
548: fprintf(stderr, "Bad event type %d\n", ev.type);
549: exit(1);
550: }
551: } else if (ev.xany.window == win->icon) {
552: icon_refresh(win);
553: } else if (ev.xany.window == win->basewin) {
554: message_send(win, &ev);
555: } else {
556: fprintf(stderr, "Internal Error: service: bad win\n");
557: fprintf(stderr, "window = %d, event = %d\n", ev.xany.window,
558: ev.type);
559: }
560: }
561: return;
562: }
563:
564: void
565: win_redraw(win, event)
566: windata *win;
567: XEvent *event;
568: {
569: XExposeEvent *ev = &event->xexpose;
570: int x1, y1, x2, y2, i, j;
571:
572: drawgrid(win);
573: if (ev) {
574: x1 = ev->x / (SQUARE_WIDTH + BORDER_WIDTH);
575: y1 = ev->y / (SQUARE_HEIGHT + BORDER_WIDTH);
576: x2 = (ev->x + ev->width) / (SQUARE_WIDTH + BORDER_WIDTH);
577: y2 = (ev->y + ev->height) / (SQUARE_HEIGHT + BORDER_WIDTH);
578: } else {
579: x1 = 0;
580: y1 = 0;
581: x2 = SIZE - 1;
582: y2 = SIZE - 1;
583: }
584:
585: if (x1 < 0) x1 = 0;
586: if (y1 < 0) y1 = 0;
587: if (x2 < 0) x2 = 0;
588: if (y2 < 0) y2 = 0;
589: if (x1 > SIZE - 1) x1 = SIZE - 1;
590: if (y1 > SIZE - 1) y1 = SIZE - 1;
591: if (x2 > SIZE - 1) x2 = SIZE - 1;
592: if (y2 > SIZE - 1) y2 = SIZE - 1;
593:
594: if (win->flipped) {
595: y1 = SIZE - y2 - 1;
596: y2 = SIZE - y1 - 1;
597: x1 = SIZE - x2 - 1;
598: x2 = SIZE - x1 - 1;
599: }
600:
601: for (i = x1; i <= x2; i++)
602: for (j = y1; j <= y2; j++) {
603: if (chessboard->square[j][i].color == NONE)
604: win_erasepiece(j, i, WHITE);
605: else
606: win_drawpiece(&chessboard->square[j][i], j, i,
607: WHITE);
608: if (!oneboard) {
609: if (chessboard->square[j][i].color == NONE)
610: win_erasepiece(j, i, BLACK);
611: else
612: win_drawpiece(&chessboard->square[j][i],
613: j, i, BLACK);
614: }
615: }
616:
617: return;
618: }
619:
620: static bool
621: setup(dispname, win)
622: char *dispname;
623: windata *win;
624: {
625: char buf[BSIZE], *s;
626: Pixmap bm, bmask;
627: Cursor cur;
628: extern char *program, *recfile;
629: XSizeHints xsizes;
630:
631:
632: if (!(win->display = XOpenDisplay(dispname)))
633: return (false);
634:
635:
636: /* Now get boolean defaults... */
637: if ((s = XGetDefault(win->display, program, "noisy")) && eq(s, "on"))
638: noisyflag = true;
639: if ((s = XGetDefault(win->display, program, "savemoves")) && eq(s, "on"))
640: saveflag = true;
641: if ((s = XGetDefault(win->display, program, "algebraic")) && eq(s, "on"))
642: record_english = false;
643: if ((s = XGetDefault(win->display, program, "blackandwhite")) && eq(s, "on"))
644: bnwflag = true;
645: if ((s = XGetDefault(win->display, program, "quickrestore")) && eq(s, "on"))
646: quickflag = true;
647: if ((s = XGetDefault(win->display, program, "flash")) && eq(s, "on"))
648: win_flashmove = true;
649:
650: /* ... numeric variables ... */
651: if (s = XGetDefault(win->display, program, "numflashes"))
652: num_flashes = atoi(s);
653: if (s = XGetDefault(win->display, program, "flashsize"))
654: flash_size = atoi(s);
655:
656: /* ... and strings. */
657: if (s = XGetDefault(win->display, program, "progname"))
658: progname = s;
659: if (s = XGetDefault(win->display, program, "proghost"))
660: proghost = s;
661: if (s = XGetDefault(win->display, program, "recordfile"))
662: recfile = s;
663: if (s = XGetDefault(win->display, program, "blackpiece"))
664: black_piece_color = s;
665: if (s = XGetDefault(win->display, program, "whitepiece"))
666: white_piece_color = s;
667: if (s = XGetDefault(win->display, program, "blacksquare"))
668: black_square_color = s;
669: if (s = XGetDefault(win->display, program, "whitesquare"))
670: white_square_color = s;
671: if (s = XGetDefault(win->display, program, "bordercolor"))
672: border_color = s;
673: if (s = XGetDefault(win->display, program, "textcolor"))
674: text_color = s;
675: if (s = XGetDefault(win->display, program, "textback"))
676: text_back = s;
677: if (s = XGetDefault(win->display, program, "errortext"))
678: error_text = s;
679: if (s = XGetDefault(win->display, program, "playertext"))
680: player_text = s;
681: if (s = XGetDefault(win->display, program, "cursorcolor"))
682: cursor_color = s;
683:
684: if ((DisplayPlanes(win->display, 0) == 1) || bnwflag)
685: win->bnw = true;
686:
687: /* Allocate colors... */
688: if (win->bnw) {
689: win->blackpiece.pixel = BlackPixel (win->display, 0);
690: win->whitepiece.pixel = WhitePixel (win->display, 0);
691: win->blacksquare.pixel = BlackPixel (win->display, 0);
692: win->whitesquare.pixel = WhitePixel (win->display, 0);
693: win->border.pixel = BlackPixel (win->display, 0);
694: win->textcolor.pixel = BlackPixel (win->display, 0);
695: win->textback.pixel = WhitePixel (win->display, 0);
696: win->playertext.pixel = BlackPixel (win->display, 0);
697: win->errortext.pixel = BlackPixel (win->display, 0);
698: win->cursorcolor.pixel = BlackPixel (win->display, 0) ;
699: } else {
700: if (!XParseColor(win->display,
701: DefaultColormap(win->display, 0),
702: black_piece_color, &win->blackpiece) ||
703: !XParseColor(win->display,
704: DefaultColormap(win->display, 0),
705: white_piece_color, &win->whitepiece) ||
706: !XParseColor(win->display,
707: DefaultColormap(win->display, 0),
708: black_square_color, &win->blacksquare) ||
709: !XParseColor(win->display,
710: DefaultColormap(win->display, 0),
711: white_square_color, &win->whitesquare) ||
712: !XParseColor(win->display,
713: DefaultColormap(win->display, 0),
714: border_color, &win->border) ||
715: !XParseColor(win->display,
716: DefaultColormap(win->display, 0),
717: text_color, &win->textcolor) ||
718: !XParseColor(win->display,
719: DefaultColormap(win->display, 0),
720: text_back, &win->textback) ||
721: !XParseColor(win->display,
722: DefaultColormap(win->display, 0),
723: error_text, &win->errortext) ||
724: !XParseColor(win->display,
725: DefaultColormap(win->display, 0),
726: player_text, &win->playertext) ||
727: !XParseColor(win->display,
728: DefaultColormap(win->display, 0),
729: cursor_color, &win->cursorcolor) ||
730: !XAllocColor(win->display,
731: DefaultColormap(win->display, 0),
732: &win->blackpiece) ||
733: !XAllocColor(win->display,
734: DefaultColormap(win->display, 0),
735: &win->whitepiece) ||
736: !XAllocColor(win->display,
737: DefaultColormap(win->display, 0),
738: &win->blacksquare) ||
739: !XAllocColor(win->display,
740: DefaultColormap(win->display, 0),
741: &win->whitesquare) ||
742: !XAllocColor(win->display,
743: DefaultColormap(win->display, 0),
744: &win->border) ||
745: !XAllocColor(win->display,
746: DefaultColormap(win->display, 0),
747: &win->textcolor) ||
748: !XAllocColor(win->display,
749: DefaultColormap(win->display, 0),
750: &win->textback) ||
751: !XAllocColor(win->display,
752: DefaultColormap(win->display, 0),
753: &win->errortext) ||
754: !XAllocColor(win->display,
755: DefaultColormap(win->display, 0),
756: &win->playertext) ||
757: !XAllocColor(win->display,
758: DefaultColormap(win->display, 0),
759: &win->cursorcolor))
760: fprintf(stderr, "Can't get colors...\n");
761: }
762:
763: /* Get fonts... */
764: if ((win->small = XLoadQueryFont(win->display,SMALL_FONT)) ==
765: NULL)
766: fprintf(stderr, "Can't get small font...\n");
767:
768: if ((win->medium = XLoadQueryFont(win->display,MEDIUM_FONT))
769: == NULL)
770: fprintf(stderr, "Can't get medium font...\n");
771:
772: if ((win->large = XLoadQueryFont(win->display,LARGE_FONT)) ==
773: NULL)
774: fprintf(stderr, "Can't get large font...\n");
775:
776:
777: /* Create the windows... */
778:
779: win->basewin =
780: XCreateSimpleWindow(win->display,DefaultRootWindow(win->display),
781: BASE_XPOS, BASE_YPOS,
782: BASE_WIDTH, BASE_HEIGHT, 0,
783: BlackPixel(win->display, 0),
784: WhitePixel(win->display, 0));
785: win->boardwin = XCreateSimpleWindow(win->display,win->basewin,
786: BOARD_XPOS, BOARD_YPOS,
787: BOARD_WIDTH, BOARD_HEIGHT,
788: BORDER_WIDTH,
789: win->border.pixel,
790: WhitePixel(win->display, 0));
791: win->recwin = XCreateSimpleWindow(win->display,win->basewin,
792: RECORD_XPOS, RECORD_YPOS,
793: RECORD_WIDTH, RECORD_HEIGHT,
794: BORDER_WIDTH, win->border.pixel,
795: win->textback.pixel);
796: win->jailwin = XCreateSimpleWindow(win->display,win->basewin,
797: JAIL_XPOS, JAIL_YPOS,
798: JAIL_WIDTH, JAIL_HEIGHT,
799: BORDER_WIDTH,
800: win->border.pixel,
801: win->textback.pixel);
802: win->wclockwin = XCreateSimpleWindow(win->display,win->basewin,
803: WCLOCK_XPOS, WCLOCK_YPOS,
804: CLOCK_WIDTH, CLOCK_HEIGHT,
805: BORDER_WIDTH, win->border.pixel,
806: win->textback.pixel);
807: win->bclockwin = XCreateSimpleWindow(win->display,win->basewin,
808: BCLOCK_XPOS, BCLOCK_YPOS,
809: CLOCK_WIDTH, CLOCK_HEIGHT,
810: BORDER_WIDTH, win->border.pixel,
811: win->textback.pixel);
812: win->messagewin = XCreateSimpleWindow(win->display,win->basewin,
813: MESS_XPOS, MESS_YPOS,
814: MESS_WIDTH, MESS_HEIGHT,
815: BORDER_WIDTH, win->border.pixel,
816: win->textback.pixel);
817: win->buttonwin = XCreateSimpleWindow(win->display,win->basewin,
818: BUTTON_XPOS, BUTTON_YPOS,
819: BUTTON_WIDTH, BUTTON_HEIGHT,
820: BORDER_WIDTH, win->border.pixel,
821: win->textback.pixel);
822:
823: /* Let's define an icon... */
824: win->iconpixmap = XCreatePixmapFromBitmapData(win->display,
825: win->basewin, icon_bits,
826: icon_width, icon_height,
827: win->blacksquare.pixel,
828: win->whitesquare.pixel,
829: 1);
830: xsizes.flags = PSize | PMinSize | PPosition;
831: xsizes.min_width = BASE_WIDTH;
832: xsizes.min_height = BASE_HEIGHT;
833: xsizes.x = BASE_XPOS;
834: xsizes.y = BASE_YPOS;
835: XSetStandardProperties(win->display, win->basewin,
836: program, program, win->iconpixmap,
837: 0, NULL, &xsizes);
838:
839: bm = XCreateBitmapFromData(win->display,
840: win->basewin, xchess_bits,
841: xchess_width, xchess_height);
842: bmask = XCreateBitmapFromData(win->display,
843: win->basewin, xchess_mask_bits,
844: xchess_width, xchess_height);
845: cur = XCreatePixmapCursor(win->display, bm, bmask,
846: &win->cursorcolor,
847: &WhitePixel(win->display, 0),
848: xchess_x_hot, xchess_y_hot);
849: XFreePixmap(win->display, bm);
850: XFreePixmap(win->display, bmask);
851:
852: XDefineCursor(win->display,win->basewin, cur);
853:
854: XMapSubwindows(win->display,win->basewin);
855: XMapRaised(win->display,win->basewin);
856:
857: XSelectInput(win->display,win->basewin, KeyPressMask);
858: XSelectInput(win->display,win->boardwin,
859: ButtonPressMask | ButtonReleaseMask | ExposureMask);
860: XSelectInput(win->display,win->recwin,
861: ButtonReleaseMask | ExposureMask);
862: XSelectInput(win->display,win->jailwin, ExposureMask);
863: XSelectInput(win->display,win->wclockwin, ExposureMask);
864: XSelectInput(win->display,win->bclockwin, ExposureMask);
865: XSelectInput(win->display,win->messagewin,
866: ButtonReleaseMask | ExposureMask);
867: XSelectInput(win->display,win->buttonwin,
868: ButtonPressMask | ExposureMask);
869:
870: message_init(win);
871: record_init(win);
872: button_draw(win);
873: jail_init(win);
874: clock_init(win, WHITE);
875: clock_init(win, BLACK);
876: if (timeunit) {
877: if (timeunit > 1800)
878: sprintf(buf, "%d moves every %.2lg hours.\n",
879: movesperunit, ((double) timeunit) / 3600);
880: else if (timeunit > 30)
881: sprintf(buf, "%d moves every %.2lg minutes.\n",
882: movesperunit, ((double) timeunit) / 60);
883: else
884: sprintf(buf, "%d moves every %d seconds.\n",
885: movesperunit, timeunit);
886: message_add(win, buf, false);
887: }
888: return (true);
889: }
890:
891: static void
892: drawgrid(win)
893: windata *win;
894: {
895: int i;
896: XGCValues gc;
897:
898: gc.function = GXcopy;
899: gc.plane_mask = AllPlanes;
900: gc.foreground = win->border.pixel;
901: gc.line_width = 0;
902: gc.line_style = LineSolid;
903:
904: XChangeGC(win->display,
905: DefaultGC(win->display, 0),
906: GCFunction | GCPlaneMask | GCForeground |
907: GCLineWidth | GCLineStyle, &gc);
908:
909: /* Draw the lines... horizontal, */
910: for (i = 1; i < SIZE; i++)
911: XDrawLine(win->display, win->boardwin,
912: DefaultGC(win->display, 0), 0,
913: i * (SQUARE_WIDTH + BORDER_WIDTH) -
914: BORDER_WIDTH / 2,
915: SIZE * (SQUARE_WIDTH + BORDER_WIDTH),
916: i * (SQUARE_WIDTH + BORDER_WIDTH) -
917: BORDER_WIDTH / 2);
918:
919: /* and vertical... */
920: for (i = 1; i < SIZE; i++)
921: XDrawLine(win->display, win->boardwin,
922: DefaultGC(win->display, 0),
923: i * (SQUARE_WIDTH + BORDER_WIDTH) -
924: BORDER_WIDTH / 2, 0,
925: i * (SQUARE_WIDTH + BORDER_WIDTH) -
926: BORDER_WIDTH / 2,
927: SIZE * (SQUARE_WIDTH + BORDER_WIDTH));
928: return;
929: }
930:
931: void
932: win_restart()
933: {
934: win1->flipped = false;
935: win_redraw(win1, (XEvent *) NULL);
936: if (!oneboard) {
937: win2->flipped = true;
938: win_redraw(win2, (XEvent *) NULL);
939: }
940: return;
941: }
942:
943: static void
944: icon_refresh(win)
945: windata *win;
946: {
947: XCopyArea(win->display, win->iconpixmap, win->icon,
948: DefaultGC(win->display, 0),
949: 0, 0, icon_width, icon_height, 0, 0);
950: return;
951: }
952:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.