Annotation of 43BSDReno/games/chess/Xchess/window.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.