Annotation of 43BSD/contrib/X/libnest/nest.c, revision 1.1.1.1

1.1       root        1: #include <X/mit-copyright.h>
                      2: 
                      3: /* Copyright    Massachusetts Institute of Technology    1986 */
                      4: 
                      5: #include <sys/types.h>
                      6: #include "../Xlib/Xlib.h"
                      7: #undef CURSOR
                      8: #include "../Xlib/Xkeyboard.h"
                      9: #include <stdio.h>
                     10: #include <errno.h>
                     11: #include "../X/vsinput.h"
                     12: #include "../X/Xdev.h"
                     13: 
                     14: extern int errno, XFlush();
                     15: char *Xalloc(), *Xrealloc(), *strcpy();
                     16: 
                     17: #define Xpixmap(p) ((Pixmap) p->data)
                     18: #define Xbitmap(b) ((Bitmap) b->data)
                     19: #define Xfinf(f) ((FontInfo *) f->data)
                     20: #define Xfont(f) (Xfinf(f)->id)
                     21: #define Xcursor(c) ((Cursor) c->data)
                     22: #define npix(p) (((p) << pixshift) | basepix)
                     23: #define opix(p) (((p) &~ basepix) >> pixshift)
                     24: #define nmask(m) ((m) << pixshift)
                     25: 
                     26: static Window w, t, ot, tt;
                     27: static int extrapix;
                     28: static int pixplanes = 0;
                     29: static int pixshift = 0;
                     30: static int basepix = 0;
                     31: static int screen_height, screen_width;
                     32: static int tilex = 0;
                     33: static int tiley = 0;
                     34: static CLIP tileclip = {0, 0, 0, 0};
                     35: static vsCursor mouse = {0, 0};
                     36: static vsBox mbox = {0, 0, 0, 0};
                     37: static int cursor_x, cursor_y;
                     38: static DEVICE *dev;
                     39: 
                     40: /*ARGSUSED*/
                     41: ProcessInput (ev)
                     42:        vsEvent ev;
                     43: {
                     44: }
                     45: 
                     46: /*ARGSUSED*/
                     47: OpenDisplay (display)
                     48:        char *display;                  /* display number */
                     49: {
                     50:        OpaqueFrame frame;
                     51:        char def[32];
                     52:        char *option;
                     53:        Color cdef;
                     54: 
                     55:        if (XOpenDisplay((char *) NULL) == NULL) {
                     56:                errno = EINVAL;
                     57:                return(-1);
                     58:        }
                     59:        if (option = XGetDefault("X", "BorderWidth"))
                     60:            frame.bdrwidth = atoi(option);
                     61:        else
                     62:            frame.bdrwidth = 0;
                     63:        if (frame.bdrwidth && DisplayCells() > 2 &&
                     64:            (option = XGetDefault("X", "Border")) &&
                     65:            XParseColor(option, &cdef) &&
                     66:            XGetHardwareColor(&cdef))
                     67:            frame.border = XMakeTile(cdef.pixel);
                     68:        else
                     69:            frame.border = BlackPixmap;
                     70:        frame.background = NULL;
                     71:        frame.x = 0;
                     72:        frame.y = 0;
                     73:        sprintf(def, "=%dx%d+0+0",
                     74:                DisplayWidth() - (frame.bdrwidth << 1),
                     75:                DisplayHeight() - (frame.bdrwidth << 1));
                     76:        w = XCreate("X", "X", "", def, &frame, 50, 50);
                     77:        screen_height = frame.height;
                     78:        screen_width = frame.width;
                     79:        XMapWindow(w);
                     80:        XSelectInput(w, KeyPressed|KeyReleased|ButtonPressed|ButtonReleased|
                     81:                        MouseMoved|EnterWindow|LeaveWindow);
                     82:        t = XCreateTransparency(w, 0, 0, screen_width, screen_height);
                     83:        ot = XCreateTransparency(w, 0, 0, screen_width, screen_height);
                     84:        XTileAbsolute(ot);
                     85:        tt = XCreateTransparency(ot, 0, 0, screen_width, screen_height);
                     86:        XMapWindow(t);
                     87:        XMapWindow(tt);
                     88:        XMapWindow(ot);
                     89:        return(dpyno());
                     90: }
                     91: 
                     92: InputReader ()
                     93: {
                     94:        XEvent xev;
                     95:        vsEvent ev;
                     96:        int nstate;
                     97:        static int state = 0;
                     98:        vsCursor ms;
                     99: 
                    100:        XPending();
                    101:        while (QLength()) {
                    102:            XNextEvent(&xev);
                    103:            switch (xev.type) {
                    104:            case EnterWindow:
                    105:                if (xev.subwindow)
                    106:                    continue;
                    107:            case MouseMoved:
                    108:                ms.x = ((XMouseMovedEvent *) (&xev))->x - cursor_x;
                    109:                ms.y = ((XMouseMovedEvent *) (&xev))->y - cursor_y;
                    110:                if ((ms.x != mouse.x || ms.y != mouse.y) &&
                    111:                    ms.x >= 0 && ms.x < screen_width &&
                    112:                    ms.y >= 0 && ms.y < screen_height) {
                    113:                    mouse = ms;
                    114:                    if (ms.y >= mbox.bottom || ms.y < mbox.top ||
                    115:                        ms.x >= mbox.right || ms.x < mbox.left) {
                    116:                        mbox.bottom = 0;
                    117:                        Deal_with_movement();
                    118:                    }
                    119:                }
                    120:                if (xev.type != EnterWindow)
                    121:                    continue;
                    122:                ev.vse_time = ((XKeyOrButtonEvent *) (&xev))->time;
                    123:                nstate = ((XEnterWindowEvent *) (&xev))->detail & ~ValueMask;
                    124:                nstate ^= state;
                    125:                ev.vse_direction = VSE_KBTUP;
                    126:                ButtonTransition(&ev, nstate & state);
                    127:                KeyTransition(&ev, nstate & state);
                    128:                ev.vse_direction = VSE_KBTDOWN;
                    129:                KeyTransition(&ev, nstate & ~state);
                    130:                ButtonTransition(&ev, nstate & ~state);
                    131:                continue;
                    132:            case LeaveWindow:
                    133:                state = ((XLeaveWindowEvent *) (&xev))->detail & ~ValueMask;
                    134:                continue;
                    135:            }
                    136:            ev.vse_x = mouse.x;
                    137:            ev.vse_y = mouse.y;
                    138:            ev.vse_time = ((XKeyOrButtonEvent *) (&xev))->time;
                    139:            ev.vse_key = ((XKeyOrButtonEvent *) (&xev))->detail & ValueMask;
                    140:            switch (xev.type) {
                    141:            case KeyPressed:
                    142:                ev.vse_device = VSE_DKB;
                    143:                ev.vse_direction = VSE_KBTDOWN;
                    144:                break;
                    145:            case KeyReleased:
                    146:                ev.vse_device = VSE_DKB;
                    147:                ev.vse_direction = VSE_KBTUP;
                    148:                break;
                    149:            case ButtonPressed:
                    150:                ev.vse_device = VSE_MOUSE;
                    151:                ev.vse_direction = VSE_KBTDOWN;
                    152:                ev.vse_key = 2 - ev.vse_key;
                    153:                break;
                    154:            case ButtonReleased:
                    155:                ev.vse_device = VSE_MOUSE;
                    156:                ev.vse_direction = VSE_KBTUP;
                    157:                ev.vse_key = 2 - ev.vse_key;
                    158:                break;
                    159:            }
                    160:            Deal_with_input(&ev);
                    161:        }
                    162: }
                    163: 
                    164: KeyTransition (ev, bits)
                    165:        register vsEvent *ev;
                    166:        register int bits;
                    167: {
                    168:        ev->vse_device = VSE_DKB;
                    169:        if (bits & ControlMask) {
                    170:            ev->vse_x = mouse.x;
                    171:            ev->vse_y = mouse.y;
                    172:            ev->vse_key = KC_CTRL;
                    173:            Deal_with_input(ev);
                    174:        }
                    175:        if (bits & MetaMask) {
                    176:            ev->vse_x = mouse.x;
                    177:            ev->vse_y = mouse.y;
                    178:            ev->vse_key = KC_META;
                    179:            Deal_with_input(ev);
                    180:        }
                    181:        if (bits & ShiftMask) {
                    182:            ev->vse_x = mouse.x;
                    183:            ev->vse_y = mouse.y;
                    184:            ev->vse_key = KC_SHIFT;
                    185:            Deal_with_input(ev);
                    186:        }
                    187:        if (bits & ShiftLockMask) {
                    188:            ev->vse_x = mouse.x;
                    189:            ev->vse_y = mouse.y;
                    190:            ev->vse_key = KC_LOCK;
                    191:            Deal_with_input(ev);
                    192:        }
                    193: }
                    194: 
                    195: ButtonTransition (ev, bits)
                    196:        register vsEvent *ev;
                    197:        register int bits;
                    198: {
                    199:        ev->vse_device = VSE_MOUSE;
                    200:        if (bits & LeftMask) {
                    201:            ev->vse_x = mouse.x;
                    202:            ev->vse_y = mouse.y;
                    203:            ev->vse_key = 2 - LeftButton;
                    204:            Deal_with_input(ev);
                    205:        }
                    206:        if (bits & MiddleMask) {
                    207:            ev->vse_x = mouse.x;
                    208:            ev->vse_y = mouse.y;
                    209:            ev->vse_key = 2 - MiddleButton;
                    210:            Deal_with_input(ev);
                    211:        }
                    212:        if (bits & RightMask) {
                    213:            ev->vse_x = mouse.x;
                    214:            ev->vse_y = mouse.y;
                    215:            ev->vse_key = 2 - RightButton;
                    216:            Deal_with_input(ev);
                    217:        }
                    218: }
                    219: 
                    220: InitDisplay (info)
                    221:        DEVICE *info;                   /* device data */
                    222: {
                    223:        char *option;
                    224:        int planes;
                    225:        static vsEventQueue queue = {NULL, 0, 0, 0};
                    226: 
                    227:        dev = info;
                    228:        info->id = XDEV_XNEST;
                    229:        info->width = screen_width;
                    230:        info->height = screen_height;
                    231:        info->planes = DisplayPlanes();
                    232:        info->entries = 0;
                    233:        pixplanes = 0;
                    234:        if (DisplayCells() > 2 &&
                    235:            (option = XGetDefault("X", "CellExponent")) &&
                    236:            (pixplanes = atoi(option)) &&
                    237:            XGetColorCells(0, 1, 0, &planes, &extrapix)) {
                    238:            while (pixplanes &&
                    239:                   !XGetColorCells(1, 1, pixplanes, &planes, &basepix))
                    240:                pixplanes--;
                    241:            if (pixplanes) {
                    242:                info->entries = 1 << pixplanes;
                    243:                while (!(planes & 1)) {
                    244:                    pixshift++;
                    245:                    planes >>= 1;
                    246:                }
                    247:            } else
                    248:                XFreeColors(&extrapix, 1, 0);
                    249:        }
                    250:        info->mouse = &mouse;
                    251:        info->mbox = &mbox;
                    252:        info->queue = &queue;
                    253:        Define_input_handler(InputReader);
                    254:        Define_block_handler(XFlush);
                    255:        return(0);
                    256: }
                    257: 
                    258: DisplayDead ()
                    259: {
                    260:        return(0);
                    261: }
                    262: 
                    263: InitMouse ()
                    264: {
                    265: }
                    266: 
                    267: caddr_t AllocateSpace (bytes)
                    268:        int bytes;                      /* number of bytes to allocate */
                    269: {
                    270:        static char *buf = NULL;
                    271:        static int buflen = 0;
                    272: 
                    273:        if (bytes > buflen) {
                    274:            free(buf);
                    275:            buf = Xalloc((bytes + 0xff) &~ 0xff);
                    276:        }
                    277:        return(buf);
                    278: }
                    279: 
                    280: PixFill (srcpix, xymask, dstx, dsty, width, height, clips, clipcount,
                    281:         func, zmask)
                    282:        int srcpix;                     /* source pixel */
                    283:        BITMAP *xymask;                 /* source mask or NULL */
                    284:        int dstx, dsty;                 /* destination */
                    285:        int width, height;
                    286:        register CLIP *clips;           /* clipping rectangles */
                    287:        int clipcount;                  /* count of rectangles */
                    288:        int func;                       /* GX display function */
                    289:        int zmask;                      /* plane mask */
                    290: {
                    291:        srcpix = npix(srcpix);
                    292:        zmask = nmask(zmask);
                    293:        for (; --clipcount >= 0; clips++) {
                    294:            SetClip(clips);
                    295:            XPixFill(t, dstx - clips->left, dsty - clips->top, width, height,
                    296:                     srcpix, xymask ? Xbitmap(xymask) : NULL, func, zmask);
                    297:        }
                    298: }
                    299: 
                    300: TileFill (tile, xoff, yoff, xymask, dstx, dsty, width, height,
                    301:          clips, clipcount, func, zmask)
                    302:        PIXMAP *tile;                   /* source tile */
                    303:        int xoff, yoff;                 /* tile origin */
                    304:        BITMAP *xymask;                 /* source mask or NULL */
                    305:        int dstx, dsty;                 /* destination */
                    306:        int width, height;
                    307:        register CLIP *clips;           /* clipping rectangles */
                    308:        int clipcount;                  /* count of rectangles */
                    309:        int func;                       /* GX display function */
                    310:        int zmask;                      /* plane mask */
                    311: {
                    312:        zmask = nmask(zmask);
                    313:        SetTileOrigin(tile, xoff, yoff);
                    314:        for (; --clipcount >= 0; clips++) {
                    315:            SetTileClip(clips);
                    316:            XTileFill(tt, dstx - clips->left, dsty - clips->top, width, height,
                    317:                      Xpixmap(tile), xymask ? Xbitmap(xymask) : NULL,
                    318:                      func, zmask);
                    319:        }
                    320: }
                    321: 
                    322: PixmapPut (src, srcx, srcy, width, height, dstx, dsty, clips, clipcount,
                    323:           func, zmask)
                    324:        PIXMAP *src;                    /* source */
                    325:        int srcx, srcy;                 /* region of source */
                    326:        int width, height;
                    327:        int dstx, dsty;                 /* destination */
                    328:        register CLIP *clips;           /* clipping rectangles */
                    329:        int clipcount;                  /* count of rectangles */
                    330:        int func;                       /* GX display function */
                    331:        int zmask;                      /* plane mask */
                    332: {
                    333:        zmask = nmask(zmask);
                    334:        for (; --clipcount >= 0; clips++) {
                    335:            SetClip(clips);
                    336:            XPixmapPut(t, srcx, srcy, dstx - clips->left, dsty - clips->top,
                    337:                       width, height, Xpixmap(src), func, zmask);
                    338:        }
                    339: }
                    340: 
                    341: PixmapBitsPut (width, height, format, data, xymask, dstx, dsty,
                    342:               clips, clipcount, func, zmask)
                    343:        int width;                      /* source width */
                    344:        int height;                     /* source height */
                    345:        int format;                     /* 0: XY-format, 1: Z-format */
                    346:        char *data;                     /* source data */
                    347:        BITMAP *xymask;                 /* source mask or NULL */
                    348:        int dstx, dsty;                 /* destination */
                    349:        register CLIP *clips;           /* clipping rectangles */
                    350:        int clipcount;                  /* count of rectangles */
                    351:        int func;                       /* GX display function */
                    352:        int zmask;                      /* plane mask */
                    353: {
                    354:        ToPixmap(width, height, format, data);
                    355:        zmask = nmask(zmask);
                    356:        for (; --clipcount >= 0; clips++) {
                    357:            SetClip(clips);
                    358:            if (format == XYFormat)
                    359:                XPixmapBitsPutXY(t, dstx - clips->left, dsty - clips->top,
                    360:                                 width, height, data,
                    361:                                 xymask ? Xbitmap(xymask) : NULL, func, zmask);
                    362:            else {
                    363:                XPixmapBitsPutZ(t, dstx - clips->left, dsty - clips->top,
                    364:                                 width, height, data,
                    365:                                 xymask ? Xbitmap(xymask) : NULL, func, zmask);
                    366:            }
                    367:        }
                    368: }
                    369: 
                    370: BitmapBitsPut (width, height, data, fore, back, xymask, dstx, dsty,
                    371:               clips, clipcount, func, zmask)
                    372:        int width;                      /* source width */
                    373:        int height;                     /* source height */
                    374:        char *data;                     /* source data */
                    375:        int fore;                       /* foreground source pixel */
                    376:        int back;                       /* background source pixel */
                    377:        BITMAP *xymask;                 /* source mask or NULL */
                    378:        int dstx, dsty;                 /* destination */
                    379:        register CLIP *clips;           /* clipping rectangles */
                    380:        int clipcount;                  /* count of rectangles */
                    381:        int func;                       /* GX display function */
                    382:        int zmask;                      /* plane mask */
                    383: {
                    384:        fore = npix(fore);
                    385:        back = npix(back);
                    386:        zmask = nmask(zmask);
                    387:        for (; --clipcount >= 0; clips++) {
                    388:            SetClip(clips);
                    389:            XBitmapBitsPut(t, dstx - clips->left, dsty - clips->top,
                    390:                           width, height, data, fore, back,
                    391:                           xymask ? Xbitmap(xymask) : NULL, func, zmask);
                    392:        }
                    393: }
                    394: 
                    395: CopyArea (srcx, srcy, width, height, dstx, dsty, clips, clipcount, func, zmask)
                    396:        int srcx, srcy;                 /* source */
                    397:        int width, height;
                    398:        int dstx, dsty;                 /* destination */
                    399:        register CLIP *clips;           /* clipping rectangles */
                    400:        int clipcount;                  /* count of rectangles */
                    401:        int func;                       /* GX display function */
                    402:        int zmask;                      /* plane mask */
                    403: {
                    404:        int dstr, dstb, left, top;
                    405: 
                    406:        dstr = dstx + width;
                    407:        dstb = dsty + height;
                    408:        srcx -= dstx;
                    409:        srcy -= dsty;
                    410:        for (; --clipcount >= 0; clips++) {
                    411:            left = clips->left;
                    412:            if (left < dstx)
                    413:                left = dstx;
                    414:            width = clips->left + clips->width;
                    415:            if (width > dstr)
                    416:                width = dstr;
                    417:            width -= left;
                    418:            top = clips->top;
                    419:            if (top < dsty)
                    420:                top = dsty;
                    421:            height = clips->top + clips->height;
                    422:            if (height > dstb)
                    423:                height = dstb;
                    424:            height -= top;
                    425:            if (width > 0 && height > 0)
                    426:                XCopyArea(w, srcx + left, srcy + top, left, top,
                    427:                          width, height, func, zmask);
                    428:        }
                    429: }
                    430: 
                    431: PrintText (string, strlen, font, fore, back, charpad, spacepad, dstx, dsty,
                    432:           clips, clipcount, func, zmask)
                    433:        char *string;                   /* character string */
                    434:        int strlen;                     /* string length */
                    435:        FONT *font;                     /* source font */
                    436:        int fore;                       /* foreground source pixel */
                    437:        int back;                       /* background source pixel */
                    438:        int charpad;                    /* inter-character pad */
                    439:        int spacepad;                   /* space-character pad */
                    440:        int dstx, dsty;                 /* destination */
                    441:        register CLIP *clips;           /* clipping rectangles */
                    442:        int clipcount;                  /* count of rectangles */
                    443:        int func;                       /* GX display function */
                    444:        int zmask;                      /* plane mask */
                    445: {
                    446:        fore = npix(fore);
                    447:        back = npix(back);
                    448:        zmask = nmask(zmask);
                    449:        for (; --clipcount >= 0; clips++) {
                    450:            SetClip(clips);
                    451:            XTextPad(t, dstx - clips->left, dsty - clips->top, string, strlen,
                    452:                     Xfont(font), charpad, spacepad, fore, back, func, zmask);
                    453:        }
                    454: }
                    455: 
                    456: PrintTextMask (string, strlen, font, srcpix, charpad, spacepad, dstx, dsty,
                    457:               clips, clipcount, func, zmask)
                    458:        char *string;                   /* character string */
                    459:        int strlen;                     /* string length */
                    460:        FONT *font;                     /* font mask */
                    461:        int srcpix;                     /* source pixel */
                    462:        int charpad;                    /* inter-character pad */
                    463:        int spacepad;                   /* space-character pad */
                    464:        int dstx, dsty;                 /* destination */
                    465:        register CLIP *clips;           /* clipping rectangles */
                    466:        int clipcount;                  /* count of rectangles */
                    467:        int func;                       /* GX display function */
                    468:        int zmask;                      /* plane mask */
                    469: {
                    470:        srcpix = npix(srcpix);
                    471:        zmask = nmask(zmask);
                    472:        for (; --clipcount >= 0; clips++) {
                    473:            SetClip(clips);
                    474:            XTextMaskPad(t, dstx - clips->left, dsty - clips->top, string,
                    475:                         strlen, Xfont(font), charpad, spacepad, srcpix,
                    476:                         func, zmask);
                    477:        }
                    478: }
                    479: 
                    480: DrawCurve (verts, vertcount, xbase, ybase, srcpix, altpix, mode,
                    481:           bwidth, bheight, pat, patlen, patmul, clips, clipcount, func, zmask)
                    482:        Vertex *verts;                  /* vertexes */
                    483:        int vertcount;                  /* vertex count */
                    484:        int xbase, ybase;               /* draw origin */
                    485:        int srcpix;                     /* source pixel *
                    486:        int altpix;                     /* alternate source pixel */
                    487:        int mode;                       /* 0: solid, 1: dashed, 2: patterned */
                    488:        int bwidth;                     /* brush width */
                    489:        int bheight;                    /* brush height */
                    490:        int pat;                        /* pattern */
                    491:        int patlen;                     /* pattern length */
                    492:        int patmul;                     /* pattern repeat count */
                    493:        register CLIP *clips;           /* clipping rectangles */
                    494:        int clipcount;                  /* count of rectangles */
                    495:        int func;                       /* GX display function */
                    496:        int zmask;                      /* plane mask */
                    497: {
                    498:        srcpix = npix(srcpix);
                    499:        altpix = npix(altpix);
                    500:        zmask = nmask(zmask);
                    501:        for (; --clipcount >= 0; clips++) {
                    502:            SetClip(clips);
                    503:            PathOffsets(verts, vertcount,
                    504:                        xbase - clips->left, ybase - clips->top);
                    505:            xbase = clips->left;
                    506:            ybase = clips->top;
                    507:            switch (mode) {
                    508:            case DrawSolidLine:
                    509:                XDraw(t, verts, vertcount, bwidth, bheight, srcpix,
                    510:                      func, zmask);
                    511:                break;
                    512:            case DrawDashedLine:
                    513:                XDrawDashed(t, verts, vertcount, bwidth, bheight, srcpix,
                    514:                            XMakePattern(pat, patlen, patmul), func, zmask);
                    515:                break;
                    516:            case DrawPatternedLine:
                    517:                XDrawPatterned(t, verts, vertcount, bwidth, bheight, srcpix,
                    518:                               altpix, XMakePattern(pat, patlen, patmul),
                    519:                               func, zmask);
                    520:                break;
                    521:            }
                    522:        }
                    523: }
                    524: 
                    525: DrawFilled (verts, vertcount, xbase, ybase, srcpix, tile, xoff, yoff,
                    526:            clips, clipcount, func, zmask)
                    527:        Vertex *verts;                  /* vertexes */
                    528:        int vertcount;                  /* vertex count */
                    529:        int xbase, ybase;               /* draw origin */
                    530:        int srcpix;                     /* source pixel */
                    531:        PIXMAP *tile;                   /* optional tile or NULL */
                    532:        int xoff, yoff;                 /* tile origin */
                    533:        register CLIP *clips;           /* clipping rectangles */
                    534:        int clipcount;                  /* count of rectangles */
                    535:        int func;                       /* GX display function */
                    536:        int zmask;                      /* plane mask */
                    537: {
                    538:        if (tile)
                    539:            SetTileOrigin(tile, xoff, yoff);
                    540:        else
                    541:            srcpix = npix(srcpix);
                    542:        zmask = nmask(zmask);
                    543:        for (; --clipcount >= 0; clips++) {
                    544:            PathOffsets(verts, vertcount,
                    545:                        xbase - clips->left, ybase - clips->top);
                    546:            xbase = clips->left;
                    547:            ybase = clips->top;
                    548:            if (tile) {
                    549:                SetTileClip(clips);
                    550:                XDrawTiled(tt, verts, vertcount, Xpixmap(tile), func, zmask);
                    551:            } else {
                    552:                SetClip(clips);
                    553:                XDrawFilled(t, verts, vertcount, srcpix, func, zmask);
                    554:            }
                    555:        }
                    556: }
                    557: 
                    558: PathOffsets (verts, vertcount, xoff, yoff)
                    559:        register Vertex *verts;
                    560:        register int vertcount, xoff, yoff;
                    561: {
                    562:        for (; --vertcount >= 0; verts++) {
                    563:            if (!(verts->flags & VertexRelative)) {
                    564:                verts->x += xoff;
                    565:                verts->y += yoff;
                    566:            }
                    567:        }
                    568: }
                    569: 
                    570: SetClip (clip)
                    571:        register CLIP *clip;
                    572: {
                    573:        static CLIP normclip = {0, 0, 0, 0};
                    574: 
                    575:        if (clip->left != normclip.left || clip->top != normclip.top ||
                    576:            clip->width != normclip.width || clip->height != normclip.height) {
                    577:            XConfigureWindow(t, clip->left, clip->top,
                    578:                             clip->width, clip->height);
                    579:            normclip = *clip;
                    580:        }
                    581: }
                    582: 
                    583: SetTileClip (clip)
                    584:        register CLIP *clip;
                    585: {
                    586:        if (clip->left != tileclip.left || clip->top != tileclip.top ||
                    587:            clip->width != tileclip.width || clip->height != tileclip.height) {
                    588:            XConfigureWindow(tt, clip->left - tilex, clip->top - tiley,
                    589:                             clip->width, clip->height);
                    590:            tileclip = *clip;
                    591:        }
                    592: }
                    593: 
                    594: SetTileOrigin (tile, xoff, yoff)
                    595:        register PIXMAP *tile;
                    596:        register int xoff, yoff;
                    597: {
                    598:        if (tile->width) {
                    599:            xoff %= tile->width;
                    600:            if (xoff)
                    601:                xoff -= tile->width;
                    602:            yoff %= tile->height;
                    603:            if (yoff)
                    604:                yoff -= tile->height;
                    605:            if (xoff != tilex || yoff != tiley) {
                    606:                XConfigureWindow(ot, xoff, yoff,
                    607:                                 screen_width - xoff, screen_height - yoff);
                    608:                tileclip.left += (xoff - tilex);
                    609:                tileclip.top += (yoff - tiley);
                    610:                tilex = xoff;
                    611:                tiley = yoff;
                    612:            }
                    613:        }
                    614: }
                    615: 
                    616: PIXMAP *PixmapSave (srcx, srcy, width, height)
                    617:        int srcx, srcy;                 /* source */
                    618:        int width, height;
                    619: {
                    620:        Pixmap pix;
                    621:        PIXMAP *pm;
                    622: 
                    623:        pix = XPixmapSave(w, srcx, srcy, width, height);
                    624:        if (pix == NULL)
                    625:            return(NULL);
                    626:        pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
                    627:        pm->width = width;
                    628:        pm->height = height;
                    629:        pm->refcnt = 1;
                    630:        pm->data = (caddr_t) pix;
                    631:        IsTile(pm);
                    632:        return(pm);
                    633: }
                    634: 
                    635: PixmapGet (srcx, srcy, width, height, client, format, swapit)
                    636:        int srcx, srcy;                 /* source */
                    637:        int width, height;
                    638:        int client;                     /* file desc to write to */
                    639:        int format;                     /* 0: XY-format, 1: Z-format */
                    640:        int swapit;                     /* 1: swap shorts */
                    641: {
                    642:        int count;
                    643:        caddr_t data;
                    644: 
                    645:        if (format == XYFormat) {
                    646:            count = (XYPixmapSize(width, height, dev->planes) + 3) & ~3;
                    647:            data = Xalloc(count);
                    648:            if (XPixmapGetXY(w, srcx, srcy, width, height, data) == NULL)
                    649:                return;
                    650:        } else {
                    651:            if (dev->planes > 8)
                    652:                count = WZPixmapSize(width, height);
                    653:            else {
                    654:                count = BZPixmapSize(width, height);
                    655:                swapit = 0;
                    656:            }
                    657:            count = (count + 3) & ~3;
                    658:            data = Xalloc(count);
                    659:            if (XPixmapGetZ(w, srcx, srcy, width, height, data) == NULL)
                    660:                return;
                    661:        }
                    662:        FromPixmap(width, height, format, data);
                    663:        if (swapit)
                    664:            Swap_shorts(data, count >> 1);
                    665:        Write(client, data, count);
                    666:        free(data);
                    667: }
                    668: 
                    669: ResolveColor (red, green, blue)
                    670:        unsigned short *red, *green, *blue;     /* update in place */
                    671: {
                    672:        Color def;
                    673: 
                    674:        if (dev->entries) {
                    675:            def.pixel = extrapix;
                    676:            def.red = *red;
                    677:            def.green = *green;
                    678:            def.blue = *blue;
                    679:            XStoreColor(&def);
                    680:            XQueryColor(&def);
                    681:            *red = def.red;
                    682:            *green = def.green;
                    683:            *blue = def.blue;
                    684:        }
                    685: }
                    686: 
                    687: StoreColors (count, entries)
                    688:        int count;                      /* number of entries */
                    689:        register ColorDef *entries;
                    690: {
                    691:        register Color *ptr;
                    692:        register int n;
                    693:        static Color *ents = NULL;
                    694:        static entcnt = 0;
                    695: 
                    696:        if (count > entcnt) {
                    697:            free ((caddr_t) ents);
                    698:            ents = (Color *) Xalloc(count * sizeof(Color));
                    699:            entcnt = count;
                    700:        }
                    701:        for (ptr = ents, n = count; --n >= 0; entries++, ptr++) {
                    702:            ptr->pixel = npix(entries->pixel);
                    703:            ptr->red = entries->red;
                    704:            ptr->green = entries->green;
                    705:            ptr->blue = entries->blue;
                    706:        }
                    707:        XStoreColors(count, ents);
                    708: }
                    709: 
                    710: FONT *GetFont (name)
                    711:        char *name;                     /* font or file name */
                    712: {
                    713:        register FontInfo *info;
                    714:        register FONT *fd;
                    715:        char *fname;
                    716: 
                    717:        info = XOpenFont(name);
                    718:        if (info == NULL) {
                    719:            errno = EINVAL;
                    720:            return(NULL);
                    721:        }
                    722:        fd = (FONT *) Xalloc(sizeof(FONT));
                    723:        fname = Xalloc(strlen(name) + 1);
                    724:        strcpy(fname, name);
                    725:        fd->name = fname;
                    726:        fd->first = info->firstchar;
                    727:        fd->last = info->lastchar;
                    728:        fd->space = ' ';
                    729:        fd->height = info->height;
                    730:        fd->avg_width = info->width;
                    731:        fd->fixed = info->fixedwidth;
                    732:        fd->base = info->baseline;
                    733:        fd->refcnt = 1;
                    734:        fd->data = (caddr_t) info;
                    735:        return(fd);
                    736: }
                    737: 
                    738: FreeFont (font)
                    739:        FONT *font;
                    740: {
                    741:        XCloseFont(Xfinf(font));
                    742:        free(font->name);
                    743:        free((caddr_t) font);
                    744: }
                    745: 
                    746: CharWidth (c, font)
                    747:        unsigned c;                     /* character */
                    748:        register FONT *font;            /* font */
                    749: {
                    750:        if (c < font->first || c > font->last)
                    751:            return(0);
                    752:        else if (font->fixed)
                    753:            return(font->avg_width);
                    754:        else
                    755:            return(Xfinf(font)->widths[c - font->first]);
                    756: }
                    757: 
                    758: TextWidth (string, strlen, spacepad, font)
                    759:        char *string;                   /* character string */
                    760:        int strlen;                     /* string length */
                    761:        int spacepad;                   /* space-character pad */
                    762:        register FONT *font;            /* font */
                    763: {
                    764:        register u_char *strptr = (u_char *) string;
                    765:        short c;
                    766:        register short *widths;
                    767:        int width = 0;
                    768: 
                    769:        if (font->fixed) {
                    770:            width = strlen * font->avg_width;
                    771:            if (spacepad) {
                    772:                while (--strlen >= 0)
                    773:                    if (*strptr++ == font->space)
                    774:                        width += spacepad;
                    775:            }
                    776:        } else {
                    777:            widths = Xfinf(font)->widths;
                    778:            while (--strlen >= 0) {
                    779:                c = *strptr++;
                    780:                if (c >= font->first && c <= font->last) {
                    781:                    if (c == font->space)
                    782:                        width += spacepad;
                    783:                    width += widths[c - font->first];
                    784:                }
                    785:            }
                    786:        }
                    787:        return (width);
                    788: }
                    789: 
                    790: BITMAP *StoreBitmap (width, height, data)
                    791:        int width;                      /* bitmap width */
                    792:        int height;                     /* bitmap height */
                    793:        char *data;                     /* bitmap data */
                    794: {
                    795:        Bitmap bitmap;
                    796:        register BITMAP *bm;
                    797: 
                    798:        bitmap = XStoreBitmap(width, height, data);
                    799:        if (bitmap == NULL)
                    800:            return(NULL);
                    801:        bm = (BITMAP *) Xalloc(sizeof(BITMAP));
                    802:        bm->width = width;
                    803:        bm->height = height;
                    804:        bm->refcnt = 1;
                    805:        bm->data = (caddr_t) bitmap;
                    806:        return(bm);
                    807: }
                    808: 
                    809: FreeBitmap (bitmap)
                    810:        BITMAP *bitmap;
                    811: {
                    812:        XFreeBitmap(Xbitmap(bitmap));
                    813:        free((caddr_t) bitmap);
                    814: }
                    815: 
                    816: BITMAP *CharBitmap (c, font)
                    817:        unsigned c;                     /* character */
                    818:        register FONT *font;            /* font */
                    819: {
                    820:        Bitmap bitmap;
                    821:        register BITMAP *bm;
                    822: 
                    823:        bitmap = XCharBitmap(Xfont(font), (int) c);
                    824:        if (bitmap == NULL)
                    825:            return(NULL);
                    826:        bm = (BITMAP *) Xalloc(sizeof(BITMAP));
                    827:        bm->width = CharWidth(c, font);
                    828:        bm->height = Xfinf(font)->height;
                    829:        bm->refcnt = 1;
                    830:        bm->data = (caddr_t) bitmap;
                    831:        return(bm);
                    832: }
                    833: 
                    834: PIXMAP *StorePixmap (width, height, format, data)
                    835:        int width;                      /* pixmap width */
                    836:        int height;                     /* pixmap height */
                    837:        int format;                     /* 0: XY-format, 1: Z-format */
                    838:        char *data;                     /* pixmap data */
                    839: {
                    840:        Pixmap pix;
                    841:        register PIXMAP *pm;
                    842: 
                    843:        ToPixmap(width, height, format, data);
                    844:        if (format == XYFormat)
                    845:            pix = XStorePixmapXY(width, height, data);
                    846:        else
                    847:            pix = XStorePixmapZ(width, height, data);
                    848:        if (pix == NULL)
                    849:            return(NULL);
                    850:        pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
                    851:        pm->width = width;
                    852:        pm->height = height;
                    853:        pm->refcnt = 1;
                    854:        pm->data = (caddr_t) pix;
                    855:        IsTile(pm);
                    856:        return(pm);
                    857: }
                    858: 
                    859: FreePixmap (pixmap)
                    860:        PIXMAP *pixmap;
                    861: {
                    862:        XFreePixmap(Xpixmap(pixmap));
                    863:        free((caddr_t) pixmap);
                    864: }
                    865: 
                    866: ToPixmap (width, height, format, data)
                    867:        int width, height, format;
                    868:        char *data;
                    869: {
                    870:        register int n;
                    871:        int shift;
                    872:        register u_short *sptr;
                    873:        register u_char *cptr;
                    874:        register char *ptr;
                    875: 
                    876:        if (dev->entries == 0)
                    877:            return;
                    878:        if (format == XYFormat) {
                    879:            n = BitmapSize(width, height);
                    880:            if (pixshift) {
                    881:                ptr = data + XYPixmapSize(width, height, dev->planes);
                    882:                shift = XYPixmapSize(width, height, pixplanes);
                    883:                bcopy(ptr - shift,
                    884:                      ptr - (shift + XYPixmapSize(width, height, pixshift)),
                    885:                      shift);
                    886:                for (shift = 0, ptr -= n;
                    887:                     shift < pixshift;
                    888:                     shift++, ptr -= n) {
                    889:                    if (basepix & (1 << shift))
                    890:                        AllOnes(ptr, width, height);
                    891:                    else
                    892:                        bzero(ptr, n);
                    893:                }
                    894:            }
                    895:            for (shift = dev->planes, ptr = data;
                    896:                 --shift >= pixshift + pixplanes;
                    897:                 ptr += n) {
                    898:                if (basepix & (1 << shift))
                    899:                    AllOnes(ptr, width, height);
                    900:            }
                    901:        } else if (dev->planes > 8) {
                    902:            for (n = WZPixmapSize(width, height) >> 1, sptr = (u_short *) data;
                    903:                 --n >= 0;
                    904:                 sptr++)            
                    905:                *sptr = npix(*sptr);
                    906:        } else {
                    907:            for (n = BZPixmapSize(width, height), cptr = (u_char *) data;
                    908:                 --n >= 0;
                    909:                 cptr++)
                    910:                *cptr = npix(*cptr);
                    911:        }
                    912: }
                    913: 
                    914: AllOnes (data, width, height)
                    915:        register char *data;
                    916:        int width, height;
                    917: {
                    918:        register int n, cnt;
                    919:        register char *ptr;
                    920: 
                    921:        n = BitmapSize(width, 1);
                    922:        for (ptr = data, cnt = n; --cnt >= 0; )
                    923:            *ptr++ = ~0;
                    924:        for (ptr = data + n, cnt = height; --cnt > 0; ptr += n)
                    925:            bcopy(data, ptr, n);
                    926: }
                    927: 
                    928: FromPixmap (width, height, format, data)
                    929:        int width, height, format;
                    930:        register char *data;
                    931: {
                    932:        register int n;
                    933:        register u_short *sptr;
                    934:        register u_char *cptr;
                    935:        register char *ptr;
                    936:        int cnt, shift;
                    937: 
                    938:        if (dev->entries == 0)
                    939:            return;
                    940:        if (format == XYFormat) {
                    941:            if (pixshift) {
                    942:                cnt = BitmapSize(width, height);
                    943:                shift = XYPixmapSize(width, height, pixshift);
                    944:                for (ptr = data + XYPixmapSize(width, height, dev->planes) - cnt,
                    945:                     n = pixshift;
                    946:                     --n >= 0;
                    947:                     ptr -= cnt)
                    948:                    bcopy(ptr - shift, ptr, cnt);
                    949:            }
                    950:            bzero(data, XYPixmapSize(width, height, dev->planes - pixplanes));
                    951:        } else if (dev->planes > 8) {
                    952:            for (n = WZPixmapSize(width, height) >> 1, sptr = (u_short *) data;
                    953:                 --n >= 0;
                    954:                 sptr++)
                    955:                *sptr = opix(*sptr);
                    956:        } else {
                    957:            for (n = BZPixmapSize(width, height), cptr = (u_char *) data;
                    958:                 --n >= 0;
                    959:                 cptr++)
                    960:                *cptr = opix(*cptr);
                    961:        }
                    962: }
                    963: 
                    964: PIXMAP *MakePixmap (xymask, fore, back)
                    965:        BITMAP *xymask;                 /* mask or NULL */
                    966:        int fore;                       /* foreground pixel */
                    967:        int back;                       /* background pixel */
                    968: {
                    969:        Pixmap pix;
                    970:        register PIXMAP *pm;
                    971: 
                    972:        pix = XMakePixmap(xymask ? Xbitmap(xymask) : NULL,
                    973:                          npix(fore), npix(back));
                    974:        if (pix == NULL)
                    975:            return(NULL);
                    976:        pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
                    977:        pm->refcnt = 1;
                    978:        pm->data = (caddr_t) pix;
                    979:        if (xymask) {
                    980:            pm->width = xymask->width;
                    981:            pm->height = xymask->height;
                    982:            IsTile(pm);
                    983:        } else {
                    984:            pm->width = 0;
                    985:            pm->height = 0;
                    986:            pm->tile = 1;
                    987:        }
                    988:        return(pm);
                    989: }
                    990: 
                    991: IsTile (pm)
                    992:        PIXMAP *pm;
                    993: {
                    994:        int width, height;
                    995: 
                    996:        XQueryTileShape(pm->width, pm->height, &width, &height);
                    997:        if (pm->width == width && pm->height == height)
                    998:            pm->tile = 1;
                    999:        else
                   1000:            pm->tile = 0;
                   1001: }
                   1002: 
                   1003: QueryShape (shape, width, height)
                   1004:        int shape;                      /* 0: cursor, 1: tile, 2: brush */
                   1005:        short *width, *height;          /* update in place */
                   1006: {
                   1007:        int rwidth, rheight;
                   1008: 
                   1009:        switch (shape) {
                   1010:        case CursorShape:
                   1011:            XQueryCursorShape(*width, *height, &rwidth, &rheight);
                   1012:            break;
                   1013:        case TileShape:
                   1014:            XQueryTileShape(*width, *height, &rwidth, &rheight);
                   1015:            break;
                   1016:        case BrushShape:
                   1017:            XQueryBrushShape(*width, *height, &rwidth, &rheight);
                   1018:            break;
                   1019:        }
                   1020:        *width = rwidth;
                   1021:        *height = rheight;
                   1022: }
                   1023: 
                   1024: CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff)
                   1025:        int func;                       /* GX display function */
                   1026:        BITMAP *image;                  /* cursor image */
                   1027:        int fore;                       /* foreground pixel */
                   1028:        int back;                       /* background pixel */
                   1029:        BITMAP *mask;                   /* cursor mask or NULL */
                   1030:        int xoff, yoff;                 /* tip */
                   1031: {
                   1032:        Cursor cursor;
                   1033:        register CURSOR *cr;
                   1034:        int width, height;
                   1035: 
                   1036:        cursor = XStoreCursor(Xbitmap(image), mask ? Xbitmap(mask) : NULL,
                   1037:                              xoff, yoff, npix(fore), npix(back), func);
                   1038:        if (cursor == NULL)
                   1039:            return(NULL);
                   1040:        XQueryCursorShape(image->width, image->height, &width, &height);
                   1041:        cr = (CURSOR *) Xalloc(sizeof(CURSOR));
                   1042:        cr->width = width;
                   1043:        cr->height = height;
                   1044:        cr->xoff = xoff;
                   1045:        cr->yoff = yoff;
                   1046:        cr->xmin = xoff;
                   1047:        cr->ymin = yoff;
                   1048:        cr->xmax = screen_width - (width - xoff);
                   1049:        cr->ymax = screen_height - (height - yoff);
                   1050:        cr->refcnt = 1;
                   1051:        cr->data = (caddr_t) cursor;
                   1052:        return(cr);
                   1053: }
                   1054: 
                   1055: FreeCursor (cursor)
                   1056:        CURSOR *cursor;
                   1057: {
                   1058:        XFreeCursor(Xcursor(cursor));
                   1059:        free((caddr_t) cursor);
                   1060: }
                   1061: 
                   1062: LoadCursor (cursor)
                   1063:        CURSOR *cursor;
                   1064: {
                   1065:        if (cursor->xoff != cursor_x || cursor->yoff != cursor_y) {
                   1066:            XCondWarpMouse(w, mouse.x + cursor->xoff, mouse.y + cursor->yoff,
                   1067:                           w, mouse.x + cursor_x, mouse.y + cursor_y, 1, 1);
                   1068:            cursor_x = cursor->xoff;
                   1069:            cursor_y = cursor->yoff;
                   1070:        }
                   1071:        XDefineCursor(w, Xcursor(cursor));
                   1072: }
                   1073: 
                   1074: /*ARGSUSED*/
                   1075: SetMouseCharacteristics (threshold, acceleration)
                   1076:        int threshold, acceleration;
                   1077: {
                   1078: }
                   1079: 
                   1080: SetCursorPosition (pos)
                   1081:        vsCursor *pos;
                   1082: {
                   1083:        XCondWarpMouse(w, pos->x + cursor_x, pos->y + cursor_y, w, 0, 0, 0, 0);
                   1084:        mouse = *pos;
                   1085: }
                   1086: 
                   1087: /*ARGSUSED*/
                   1088: SetAutoRepeat (onoff)
                   1089:        int onoff;                      /* 0: off, 1: on */
                   1090: {
                   1091: }
                   1092: 
                   1093: /*ARGSUSED*/
                   1094: SetKeyClick (volume)
                   1095:        int volume;                     /* 0: off, 1-8: on */
                   1096: {
                   1097: }
                   1098: 
                   1099: SoundBell (volume)
                   1100:        int volume;                     /* 0-7 */
                   1101: {
                   1102:        XFeep(volume);
                   1103: }
                   1104: 
                   1105: /*ARGSUSED*/
                   1106: SetLockLED (onoff)
                   1107:        int onoff;                      /* 0: off, 1: on */
                   1108: {
                   1109: }
                   1110: 
                   1111: SetVideo (onoff)
                   1112:        int onoff;                      /* 0: off, 1: on */
                   1113: {
                   1114:        return(onoff - 1);
                   1115: }

unix.superglobalmegacorp.com

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