diff options
| author | svn2git <svn2git@FreeBSD.org> | 1994-05-01 08:00:00 +0000 |
|---|---|---|
| committer | svn2git <svn2git@FreeBSD.org> | 1994-05-01 08:00:00 +0000 |
| commit | a16f65c7d117419bd266c28a1901ef129a337569 (patch) | |
| tree | 2626602f66dc3551e7a7c7bc9ad763c3bc7ab40a /gnu/games/chess/Xchess/window.c.bm | |
| parent | 8503f4f13f77abf7adc8f7e329c6f9c1d52b6a20 (diff) | |
Diffstat (limited to 'gnu/games/chess/Xchess/window.c.bm')
| -rw-r--r-- | gnu/games/chess/Xchess/window.c.bm | 928 |
1 files changed, 928 insertions, 0 deletions
diff --git a/gnu/games/chess/Xchess/window.c.bm b/gnu/games/chess/Xchess/window.c.bm new file mode 100644 index 0000000000000..efcfc0aaa8971 --- /dev/null +++ b/gnu/games/chess/Xchess/window.c.bm @@ -0,0 +1,928 @@ +/* This file contains code for X-CHESS. + Copyright (C) 1986 Free Software Foundation, Inc. + +This file is part of X-CHESS. + +X-CHESS is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY. No author or distributor +accepts responsibility to anyone for the consequences of using it +or for whether it serves any particular purpose or works at all, +unless he says so in writing. Refer to the X-CHESS General Public +License for full details. + +Everyone is granted permission to copy, modify and redistribute +X-CHESS, but only under the conditions described in the +X-CHESS General Public License. A copy of this license is +supposed to have been given to you along with X-CHESS so you +can know your rights and responsibilities. It should be in a +file named COPYING. Among other things, the copyright notice +and this notice must be preserved on all copies. */ + + +/* RCS Info: $Revision: 1.1.1.1 $ on $Date: 1993/06/12 14:41:07 $ + * $Source: /home/cvs/386BSD/src/gnu/games/chess/Xchess/window.c.bm,v $ + * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group + * Permission is granted to do anything with this code except sell it + * or remove this message. + * + * Deal with the two (or one) windows. + */ + +#include "xchess.h" +#include <sys/time.h> + +#include "pawn.bitmap" +#include "rook.bitmap" +#include "knight.bitmap" +#include "bishop.bitmap" +#include "queen.bitmap" +#include "king.bitmap" + +#include "pawn_outline.bitmap" +#include "rook_outline.bitmap" +#include "knight_outline.bitmap" +#include "bishop_outline.bitmap" +#include "queen_outline.bitmap" +#include "king_outline.bitmap" + +#include "pawn_mask.bitmap" +#include "rook_mask.bitmap" +#include "knight_mask.bitmap" +#include "bishop_mask.bitmap" +#include "queen_mask.bitmap" +#include "king_mask.bitmap" + +#include "shade.bitmap" + +#include "xchess.cur" +#include "xchess_mask.cur" + +#include "xchess.icon" + +windata *win1, *win2; +bool win_flashmove = false; + +extern bool setup(); +extern void service(), drawgrid(), icon_refresh(); + +bool +win_setup(disp1, disp2) + char *disp1, *disp2; +{ + win1 = alloc(windata); + if (!oneboard) + win2 = alloc(windata); + + if (!setup(disp1, win1) || (!oneboard && !setup(disp2, win2))) + return (false); + + if (blackflag) { + win1->color = BLACK; + win1->flipped = true; + } else + win1->color = WHITE; + win_drawboard(win1); + + if (!oneboard) { + win2->color = BLACK; + win2->flipped = true; + win_drawboard(win2); + } + + return(true); +} + +/* Draw the chess board... */ + +void +win_drawboard(win) + windata *win; +{ + int i, j; + + drawgrid(win); + + /* Now toss on the squares... */ + for (i = 0; i < SIZE; i++) + for (j = 0; j < SIZE; j++) + win_erasepiece(j, i, win->color); + + return; +} + +/* Draw one piece. */ + +void +win_drawpiece(p, y, x, wnum) + piece *p; + int y, x; + color wnum; +{ + char *bits, *maskbits, *outline; + windata *win; + char buf[BSIZE]; + XImage *tmpImage; + Pixmap tmpPM, maskPM; + XGCValues gc; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + y = SIZE - y - 1; + x = SIZE - x - 1; + } + + /* + if (debug) + fprintf(stderr, "draw a %s at (%d, %d) on board %d\n", + piecenames[(int) p->type], y, x, wnum); + */ + + if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) exit(1); + + switch (p->type) { + case PAWN: + bits = pawn_bits; + maskbits = pawn_mask_bits; + outline = pawn_outline_bits; + break; + + case ROOK: + bits = rook_bits; + maskbits = rook_mask_bits; + outline = rook_outline_bits; + break; + + case KNIGHT: + bits = knight_bits; + maskbits = knight_mask_bits; + outline = knight_outline_bits; + break; + + case BISHOP: + bits = bishop_bits; + maskbits = bishop_mask_bits; + outline = bishop_outline_bits; + break; + + case QUEEN: + bits = queen_bits; + maskbits = queen_mask_bits; + outline = queen_outline_bits; + break; + + case KING: + bits = king_bits; + maskbits = king_mask_bits; + outline = king_outline_bits; + break; + + default: + fprintf(stderr, + "Internal Error: win_drawpiece: bad piece type %d\n", + p->type); + } + + /* There are two things we can do... If this is a black and white + * display, we have to shade the square and use an outline if the piece + * is white. We also have to use a mask... Since we don't want + * to use up too many bitmaps, create the mask bitmap, put the bits, + * and then destroy it. + */ + if (win->bnw && (p->color == WHITE)) + bits = outline; + if (win->bnw && !iswhite(win, x, y)) { + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + shade_bits, SQUARE_WIDTH, SQUARE_HEIGHT); + + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + + XFreePixmap(win->display, tmpPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), + GXandInverted); + maskPM = XCreateBitmapFromData(win->display, win->boardwin, + maskbits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, maskPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, maskPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), + GXor); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + + XSetFunction(win->display, DefaultGC(win->display, 0), GXcopy); + + } else if (win->bnw){ + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + } else { + XSetState(win->display, DefaultGC(win->display, 0), + ((p->color == WHITE) ? win->whitepiece.pixel : + win->blackpiece.pixel), + (iswhite(win, x, y) ? win->whitesquare.pixel : + win->blacksquare.pixel), + GXcopy, AllPlanes); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + bits, SQUARE_WIDTH, SQUARE_HEIGHT); + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + XFreePixmap(win->display, tmpPM); + } + + if (!record_english) { + gc.foreground = win->textcolor.pixel; + if (iswhite(win, x, y) || win->bnw) + gc.background = win->whitesquare.pixel; + else + gc.background = win->blacksquare.pixel; + + gc.font = win->small->fid; + + XChangeGC(win->display, DefaultGC(win->display, 0), + GCForeground | GCBackground | GCFont, &gc); + + if (!x) { + sprintf(buf, " %d", SIZE - y); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + 1, (y + 1) * (SQUARE_HEIGHT + + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 2); + } + if (y == SIZE - 1) { + sprintf(buf, "%c", 'A' + x); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH) + 1, + SIZE * (SQUARE_HEIGHT + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 1); + } + } + return; +} + +void +win_erasepiece(y, x, wnum) + int y, x; + color wnum; +{ + windata *win; + char buf[BSIZE]; + XGCValues gc; + Pixmap tmpPM; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + y = SIZE - y - 1; + x = SIZE - x - 1; + } + + /* + if (debug) + fprintf(stderr, "erase square (%d, %d) on board %d\n", y, x, + wnum); + */ + + if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) exit(1); + + if (win->bnw && !iswhite(win, x, y)) { + XSetState(win->display, DefaultGC(win->display, 0), + BlackPixel(win->display, 0), + WhitePixel(win->display, 0), GXcopy, AllPlanes); + tmpPM = XCreateBitmapFromData(win->display, win->boardwin, + shade_bits, SQUARE_WIDTH, SQUARE_HEIGHT); + + XCopyPlane(win->display, tmpPM, win->boardwin, DefaultGC(win->display, 0), + 0, 0, SQUARE_WIDTH, SQUARE_HEIGHT, + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), 1); + + XFreePixmap(win->display, tmpPM); + } else { + XSetFillStyle(win->display, DefaultGC(win->display, 0), + FillSolid); + XSetForeground(win->display, DefaultGC(win->display, 0), + iswhite(win, x, y) ? win->whitesquare.pixel : + win->blacksquare.pixel); + XFillRectangle(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH), + y * (SQUARE_HEIGHT + BORDER_WIDTH), + SQUARE_WIDTH, SQUARE_HEIGHT); + } + + if (!record_english) { + gc.foreground = win->textcolor.pixel; + if (iswhite(win, x, y) || win->bnw) + gc.background = win->whitesquare.pixel; + else + gc.background = win->blacksquare.pixel; + + gc.font = win->small->fid; + + XChangeGC(win->display, DefaultGC(win->display, 0), + GCForeground | GCBackground | GCFont, &gc); + + if (!x) { + sprintf(buf, " %d", SIZE - y); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + 1, (y + 1) * (SQUARE_HEIGHT + + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 2); + } + if (y == SIZE - 1) { + sprintf(buf, "%c", 'A' + x); + XDrawImageString(win->display, win->boardwin, + DefaultGC(win->display, 0), + x * (SQUARE_WIDTH + BORDER_WIDTH) + 1, + SIZE * (SQUARE_HEIGHT + BORDER_WIDTH) - BORDER_WIDTH + + win->small->max_bounds.ascent - 1, buf, 1); + } + } + + + return; +} + +void +win_flash(m, wnum) + move *m; + color wnum; +{ + windata *win; + int sx, sy, ex, ey, i; + + if (oneboard || (wnum == win1->color)) + win = win1; + else + win = win2; + + if (win->flipped) { + sx = SIZE - m->fromx - 1; + sy = SIZE - m->fromy - 1; + ex = SIZE - m->tox - 1; + ey = SIZE - m->toy - 1; + } else { + sx = m->fromx; + sy = m->fromy; + ex = m->tox; + ey = m->toy; + } + sx = sx * (SQUARE_WIDTH + BORDER_WIDTH) + SQUARE_WIDTH / 2; + sy = sy * (SQUARE_HEIGHT + BORDER_WIDTH) + SQUARE_HEIGHT / 2; + ex = ex * (SQUARE_WIDTH + BORDER_WIDTH) + SQUARE_WIDTH / 2; + ey = ey * (SQUARE_HEIGHT + BORDER_WIDTH) + SQUARE_HEIGHT / 2; + + for (i = 0; i < num_flashes * 2; i++) + XDrawLine(win->display,win->boardwin, + DefaultGC(win->display, 0), + sx, sy, ex, ey); + return; +} + +/* Handle input from the players. */ + +void +win_process(quick) + bool quick; +{ + int i, rfd = 0, wfd = 0, xfd = 0; + struct timeval timeout; + + timeout.tv_sec = 0; + timeout.tv_usec = (quick ? 0 : 500000); + + if (XPending(win1->display)) + service(win1); + if (!oneboard) { + if (XPending(win1->display)) + service(win2); + } + + if (oneboard) + rfd = 1 << win1->display->fd; + else + rfd = (1 << win1->display->fd) | (1 << win2->display->fd); + if (!(i = select(32, &rfd, &wfd, &xfd, &timeout))) + return; + if (i == -1) { + perror("select"); + exit(1); + } + if (rfd & (1 << win1->display->fd)) + service(win1); + if (!oneboard && (rfd & (1 << win2->display->fd))) + service(win2); + + return; +} + +static void +service(win) + windata *win; +{ + XEvent ev; + + while(XPending(win->display)) { + XNextEvent(win->display, &ev); + if (TxtFilter(win->display, &ev)) + continue; + + if (ev.xany.window == win->boardwin) { + switch (ev.type) { + case ButtonPress: + button_pressed(&ev, win); + break; + + case ButtonRelease: + button_released(&ev, win); + break; + + case Expose: + /* Redraw... */ + win_redraw(win, &ev); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->wclockwin) { + switch (ev.type) { + case Expose: + clock_draw(win, WHITE); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->bclockwin) { + switch (ev.type) { + case Expose: + clock_draw(win, BLACK); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->jailwin) { + switch (ev.type) { + case Expose: + jail_draw(win); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->buttonwin) { + switch (ev.type) { + case ButtonPress: + button_service(win, &ev); + break; + + case Expose: + button_draw(win); + break; + + case 0: + case NoExpose: + break; + default: + fprintf(stderr, "Bad event type %d\n", ev.type); + exit(1); + } + } else if (ev.xany.window == win->icon) { + icon_refresh(win); + } else if (ev.xany.window == win->basewin) { + message_send(win, &ev); + } else { + fprintf(stderr, "Internal Error: service: bad win\n"); + fprintf(stderr, "window = %d, event = %d\n", ev.xany.window, + ev.type); + } + } + return; +} + +void +win_redraw(win, event) + windata *win; + XEvent *event; +{ + XExposeEvent *ev = &event->xexpose; + int x1, y1, x2, y2, i, j; + + drawgrid(win); + if (ev) { + x1 = ev->x / (SQUARE_WIDTH + BORDER_WIDTH); + y1 = ev->y / (SQUARE_HEIGHT + BORDER_WIDTH); + x2 = (ev->x + ev->width) / (SQUARE_WIDTH + BORDER_WIDTH); + y2 = (ev->y + ev->height) / (SQUARE_HEIGHT + BORDER_WIDTH); + } else { + x1 = 0; + y1 = 0; + x2 = SIZE - 1; + y2 = SIZE - 1; + } + + if (x1 < 0) x1 = 0; + if (y1 < 0) y1 = 0; + if (x2 < 0) x2 = 0; + if (y2 < 0) y2 = 0; + if (x1 > SIZE - 1) x1 = SIZE - 1; + if (y1 > SIZE - 1) y1 = SIZE - 1; + if (x2 > SIZE - 1) x2 = SIZE - 1; + if (y2 > SIZE - 1) y2 = SIZE - 1; + + if (win->flipped) { + y1 = SIZE - y2 - 1; + y2 = SIZE - y1 - 1; + x1 = SIZE - x2 - 1; + x2 = SIZE - x1 - 1; + } + + for (i = x1; i <= x2; i++) + for (j = y1; j <= y2; j++) { + if (chessboard->square[j][i].color == NONE) + win_erasepiece(j, i, WHITE); + else + win_drawpiece(&chessboard->square[j][i], j, i, + WHITE); + if (!oneboard) { + if (chessboard->square[j][i].color == NONE) + win_erasepiece(j, i, BLACK); + else + win_drawpiece(&chessboard->square[j][i], + j, i, BLACK); + } + } + + return; +} + +static bool +setup(dispname, win) + char *dispname; + windata *win; +{ + char buf[BSIZE], *s; + Pixmap bm, bmask; + Cursor cur; + extern char *program, *recfile; + + + if (!(win->display = XOpenDisplay(dispname))) + return (false); + + + /* Now get boolean defaults... */ + if ((s = XGetDefault(win->display, program, "noisy")) && eq(s, "on")) + noisyflag = true; + if ((s = XGetDefault(win->display, program, "savemoves")) && eq(s, "on")) + saveflag = true; + if ((s = XGetDefault(win->display, program, "algebraic")) && eq(s, "on")) + record_english = false; + if ((s = XGetDefault(win->display, program, "blackandwhite")) && eq(s, "on")) + bnwflag = true; + if ((s = XGetDefault(win->display, program, "quickrestore")) && eq(s, "on")) + quickflag = true; + if ((s = XGetDefault(win->display, program, "flash")) && eq(s, "on")) + win_flashmove = true; + + /* ... numeric variables ... */ + if (s = XGetDefault(win->display, program, "numflashes")) + num_flashes = atoi(s); + if (s = XGetDefault(win->display, program, "flashsize")) + flash_size = atoi(s); + + /* ... and strings. */ + if (s = XGetDefault(win->display, program, "progname")) + progname = s; + if (s = XGetDefault(win->display, program, "proghost")) + proghost = s; + if (s = XGetDefault(win->display, program, "recordfile")) + recfile = s; + if (s = XGetDefault(win->display, program, "blackpiece")) + black_piece_color = s; + if (s = XGetDefault(win->display, program, "whitepiece")) + white_piece_color = s; + if (s = XGetDefault(win->display, program, "blacksquare")) + black_square_color = s; + if (s = XGetDefault(win->display, program, "whitesquare")) + white_square_color = s; + if (s = XGetDefault(win->display, program, "bordercolor")) + border_color = s; + if (s = XGetDefault(win->display, program, "textcolor")) + text_color = s; + if (s = XGetDefault(win->display, program, "textback")) + text_back = s; + if (s = XGetDefault(win->display, program, "errortext")) + error_text = s; + if (s = XGetDefault(win->display, program, "playertext")) + player_text = s; + if (s = XGetDefault(win->display, program, "cursorcolor")) + cursor_color = s; + + if ((DisplayPlanes(win->display, 0) == 1) || bnwflag) + win->bnw = true; + + /* Allocate colors... */ + if (win->bnw) { + win->blackpiece.pixel = BlackPixel (win->display, 0); + win->whitepiece.pixel = WhitePixel (win->display, 0); + win->blacksquare.pixel = BlackPixel (win->display, 0); + win->whitesquare.pixel = WhitePixel (win->display, 0); + win->border.pixel = BlackPixel (win->display, 0); + win->textcolor.pixel = BlackPixel (win->display, 0); + win->textback.pixel = WhitePixel (win->display, 0); + win->playertext.pixel = BlackPixel (win->display, 0); + win->errortext.pixel = BlackPixel (win->display, 0); + win->cursorcolor.pixel = BlackPixel (win->display, 0) ; + } else { + if (!XParseColor(win->display, + DefaultColormap(win->display, 0), + black_piece_color, &win->blackpiece) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + white_piece_color, &win->whitepiece) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + black_square_color, &win->blacksquare) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + white_square_color, &win->whitesquare) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + border_color, &win->border) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + text_color, &win->textcolor) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + text_back, &win->textback) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + error_text, &win->errortext) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + player_text, &win->playertext) || + !XParseColor(win->display, + DefaultColormap(win->display, 0), + cursor_color, &win->cursorcolor) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->blackpiece) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->whitepiece) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->blacksquare) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->whitesquare) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->border) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->textcolor) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->textback) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->errortext) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->playertext) || + !XAllocColor(win->display, + DefaultColormap(win->display, 0), + &win->cursorcolor)) + fprintf(stderr, "Can't get color...\n"); + } + + /* Get fonts... */ + win->small = XLoadQueryFont(win->display,SMALL_FONT); + win->medium = XLoadQueryFont(win->display,MEDIUM_FONT); + win->large = XLoadQueryFont(win->display,LARGE_FONT); + + /* Create the windows... */ + + win->basewin = + XCreateSimpleWindow(win->display,DefaultRootWindow(win->display), + BASE_XPOS, BASE_YPOS, + BASE_WIDTH, BASE_HEIGHT, 0, + BlackPixel(win->display, 0), + WhitePixel(win->display, 0)); + win->boardwin = XCreateSimpleWindow(win->display,win->basewin, + BOARD_XPOS, BOARD_YPOS, + BOARD_WIDTH, BOARD_HEIGHT, + BORDER_WIDTH, + win->border.pixel, + WhitePixel(win->display, 0)); + win->recwin = XCreateSimpleWindow(win->display,win->basewin, + RECORD_XPOS, RECORD_YPOS, + RECORD_WIDTH, RECORD_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->jailwin = XCreateSimpleWindow(win->display,win->basewin, + JAIL_XPOS, JAIL_YPOS, + JAIL_WIDTH, JAIL_HEIGHT, + BORDER_WIDTH, + win->border.pixel, + win->textback.pixel); + win->wclockwin = XCreateSimpleWindow(win->display,win->basewin, + WCLOCK_XPOS, WCLOCK_YPOS, + CLOCK_WIDTH, CLOCK_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->bclockwin = XCreateSimpleWindow(win->display,win->basewin, + BCLOCK_XPOS, BCLOCK_YPOS, + CLOCK_WIDTH, CLOCK_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->messagewin = XCreateSimpleWindow(win->display,win->basewin, + MESS_XPOS, MESS_YPOS, + MESS_WIDTH, MESS_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + win->buttonwin = XCreateSimpleWindow(win->display,win->basewin, + BUTTON_XPOS, BUTTON_YPOS, + BUTTON_WIDTH, BUTTON_HEIGHT, + BORDER_WIDTH, win->border.pixel, + win->textback.pixel); + + /* Let's define an icon... */ + win->iconpixmap = XCreatePixmapFromBitmapData(win->display, + win->basewin, icon_bits, + icon_width, icon_height, + win->blacksquare.pixel, + win->whitesquare.pixel, + 1); + + bm = XCreateBitmapFromData(win->display, + win->basewin, xchess_bits, + xchess_width, xchess_height); + bmask = XCreateBitmapFromData(win->display, + win->basewin, xchess_mask_bits, + xchess_width, xchess_height); + cur = XCreatePixmapCursor(win->display, bm, bmask, + &win->cursorcolor, + &WhitePixel(win->display, 0), + xchess_x_hot, xchess_y_hot); + XFreePixmap(win->display, bm); + XFreePixmap(win->display, bmask); + + XDefineCursor(win->display,win->basewin, cur); + + XMapSubwindows(win->display,win->basewin); + XMapRaised(win->display,win->basewin); + + XSelectInput(win->display,win->basewin, KeyPressMask); + XSelectInput(win->display,win->boardwin, + ButtonPressMask | ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->recwin, + ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->jailwin, ExposureMask); + XSelectInput(win->display,win->wclockwin, ExposureMask); + XSelectInput(win->display,win->bclockwin, ExposureMask); + XSelectInput(win->display,win->messagewin, + ButtonReleaseMask | ExposureMask); + XSelectInput(win->display,win->buttonwin, + ButtonPressMask | ExposureMask); + + message_init(win); + record_init(win); + button_draw(win); + jail_init(win); + clock_init(win, WHITE); + clock_init(win, BLACK); + if (timeunit) { + if (timeunit > 1800) + sprintf(buf, "%d moves every %.2lg hours.\n", + movesperunit, ((double) timeunit) / 3600); + else if (timeunit > 30) + sprintf(buf, "%d moves every %.2lg minutes.\n", + movesperunit, ((double) timeunit) / 60); + else + sprintf(buf, "%d moves every %d seconds.\n", + movesperunit, timeunit); + message_add(win, buf, false); + } + + return (true); +} + +static void +drawgrid(win) + windata *win; +{ + int i; + XGCValues gc; + + gc.function = GXcopy; + gc.plane_mask = AllPlanes; + gc.foreground = win->border.pixel; + gc.line_width = 0; + gc.line_style = LineSolid; + + XChangeGC(win->display, + DefaultGC(win->display, 0), + GCFunction | GCPlaneMask | GCForeground | + GCLineWidth | GCLineStyle, &gc); + + /* Draw the lines... horizontal, */ + for (i = 1; i < SIZE; i++) + XDrawLine(win->display, win->boardwin, + DefaultGC(win->display, 0), 0, + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, + SIZE * (SQUARE_WIDTH + BORDER_WIDTH), + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2); + + /* and vertical... */ + for (i = 1; i < SIZE; i++) + XDrawLine(win->display, win->boardwin, + DefaultGC(win->display, 0), + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, 0, + i * (SQUARE_WIDTH + BORDER_WIDTH) - + BORDER_WIDTH / 2, + SIZE * (SQUARE_WIDTH + BORDER_WIDTH)); + return; +} + +void +win_restart() +{ + win1->flipped = false; + win_redraw(win1, (XEvent *) NULL); + if (!oneboard) { + win2->flipped = true; + win_redraw(win2, (XEvent *) NULL); + } + return; +} + +static void +icon_refresh(win) + windata *win; +{ + XCopyArea(win->display, win->iconpixmap, win->icon, + DefaultGC(win->display, 0), + 0, 0, icon_width, icon_height, 0, 0); + return; +} + |
