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