Annotation of 43BSDReno/games/chess/Xchess/window.c.bm, 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 <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: 

unix.superglobalmegacorp.com

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