Annotation of 43BSDTahoe/new/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: int StippleFill (srcpix, xoff, yoff, stipmask, dstx, dsty, width, height,
                    323:        clips, clipcount, func, zmask)
                    324:        int srcpix;             /* source pixel */
                    325:        int xoff, yoff;         /* stipple origin */
                    326:        BITMAP *stipmask;       /* stipple mask */
                    327:        int dstx, dsty;         /* destination */
                    328:        int width, height;
                    329:        CLIP *clips;            /* clipping rectangles */
                    330:        int clipcount;
                    331:        int func;               /* GX display function */
                    332:        int zmask;              /* plane mask */
                    333: {
                    334:        return (1);
                    335: }
                    336: PixmapPut (src, srcx, srcy, width, height, dstx, dsty, clips, clipcount,
                    337:           func, zmask)
                    338:        PIXMAP *src;                    /* source */
                    339:        int srcx, srcy;                 /* region of source */
                    340:        int width, height;
                    341:        int dstx, dsty;                 /* destination */
                    342:        register CLIP *clips;           /* clipping rectangles */
                    343:        int clipcount;                  /* count of rectangles */
                    344:        int func;                       /* GX display function */
                    345:        int zmask;                      /* plane mask */
                    346: {
                    347:        zmask = nmask(zmask);
                    348:        for (; --clipcount >= 0; clips++) {
                    349:            SetClip(clips);
                    350:            XPixmapPut(t, srcx, srcy, dstx - clips->left, dsty - clips->top,
                    351:                       width, height, Xpixmap(src), func, zmask);
                    352:        }
                    353: }
                    354: 
                    355: PixmapBitsPut (width, height, format, data, xymask, dstx, dsty,
                    356:               clips, clipcount, func, zmask)
                    357:        int width;                      /* source width */
                    358:        int height;                     /* source height */
                    359:        int format;                     /* 0: XY-format, 1: Z-format */
                    360:        char *data;                     /* source data */
                    361:        BITMAP *xymask;                 /* source mask or NULL */
                    362:        int dstx, dsty;                 /* destination */
                    363:        register CLIP *clips;           /* clipping rectangles */
                    364:        int clipcount;                  /* count of rectangles */
                    365:        int func;                       /* GX display function */
                    366:        int zmask;                      /* plane mask */
                    367: {
                    368:        ToPixmap(width, height, format, data);
                    369:        zmask = nmask(zmask);
                    370:        for (; --clipcount >= 0; clips++) {
                    371:            SetClip(clips);
                    372:            if (format == XYFormat)
                    373:                XPixmapBitsPutXY(t, dstx - clips->left, dsty - clips->top,
                    374:                                 width, height, data,
                    375:                                 xymask ? Xbitmap(xymask) : NULL, func, zmask);
                    376:            else {
                    377:                XPixmapBitsPutZ(t, dstx - clips->left, dsty - clips->top,
                    378:                                 width, height, data,
                    379:                                 xymask ? Xbitmap(xymask) : NULL, func, zmask);
                    380:            }
                    381:        }
                    382: }
                    383: 
                    384: BitmapBitsPut (width, height, data, fore, back, xymask, dstx, dsty,
                    385:               clips, clipcount, func, zmask)
                    386:        int width;                      /* source width */
                    387:        int height;                     /* source height */
                    388:        char *data;                     /* source data */
                    389:        int fore;                       /* foreground source pixel */
                    390:        int back;                       /* background source pixel */
                    391:        BITMAP *xymask;                 /* source mask or NULL */
                    392:        int dstx, dsty;                 /* destination */
                    393:        register CLIP *clips;           /* clipping rectangles */
                    394:        int clipcount;                  /* count of rectangles */
                    395:        int func;                       /* GX display function */
                    396:        int zmask;                      /* plane mask */
                    397: {
                    398:        fore = npix(fore);
                    399:        back = npix(back);
                    400:        zmask = nmask(zmask);
                    401:        for (; --clipcount >= 0; clips++) {
                    402:            SetClip(clips);
                    403:            XBitmapBitsPut(t, dstx - clips->left, dsty - clips->top,
                    404:                           width, height, data, fore, back,
                    405:                           xymask ? Xbitmap(xymask) : NULL, func, zmask);
                    406:        }
                    407: }
                    408: 
                    409: CopyArea (srcx, srcy, width, height, dstx, dsty, clips, clipcount, func, zmask)
                    410:        int srcx, srcy;                 /* source */
                    411:        int width, height;
                    412:        int dstx, dsty;                 /* destination */
                    413:        register CLIP *clips;           /* clipping rectangles */
                    414:        int clipcount;                  /* count of rectangles */
                    415:        int func;                       /* GX display function */
                    416:        int zmask;                      /* plane mask */
                    417: {
                    418:        int dstr, dstb, left, top;
                    419: 
                    420:        dstr = dstx + width;
                    421:        dstb = dsty + height;
                    422:        srcx -= dstx;
                    423:        srcy -= dsty;
                    424:        for (; --clipcount >= 0; clips++) {
                    425:            left = clips->left;
                    426:            if (left < dstx)
                    427:                left = dstx;
                    428:            width = clips->left + clips->width;
                    429:            if (width > dstr)
                    430:                width = dstr;
                    431:            width -= left;
                    432:            top = clips->top;
                    433:            if (top < dsty)
                    434:                top = dsty;
                    435:            height = clips->top + clips->height;
                    436:            if (height > dstb)
                    437:                height = dstb;
                    438:            height -= top;
                    439:            if (width > 0 && height > 0)
                    440:                XCopyArea(w, srcx + left, srcy + top, left, top,
                    441:                          width, height, func, zmask);
                    442:        }
                    443: }
                    444: 
                    445: PrintText (string, strlen, font, fore, back, charpad, spacepad, dstx, dsty,
                    446:           clips, clipcount, func, zmask)
                    447:        char *string;                   /* character string */
                    448:        int strlen;                     /* string length */
                    449:        FONT *font;                     /* source font */
                    450:        int fore;                       /* foreground source pixel */
                    451:        int back;                       /* background source pixel */
                    452:        int charpad;                    /* inter-character pad */
                    453:        int spacepad;                   /* space-character pad */
                    454:        int dstx, dsty;                 /* destination */
                    455:        register CLIP *clips;           /* clipping rectangles */
                    456:        int clipcount;                  /* count of rectangles */
                    457:        int func;                       /* GX display function */
                    458:        int zmask;                      /* plane mask */
                    459: {
                    460:        fore = npix(fore);
                    461:        back = npix(back);
                    462:        zmask = nmask(zmask);
                    463:        for (; --clipcount >= 0; clips++) {
                    464:            SetClip(clips);
                    465:            XTextPad(t, dstx - clips->left, dsty - clips->top, string, strlen,
                    466:                     Xfont(font), charpad, spacepad, fore, back, func, zmask);
                    467:        }
                    468: }
                    469: 
                    470: PrintTextMask (string, strlen, font, srcpix, charpad, spacepad, dstx, dsty,
                    471:               clips, clipcount, func, zmask)
                    472:        char *string;                   /* character string */
                    473:        int strlen;                     /* string length */
                    474:        FONT *font;                     /* font mask */
                    475:        int srcpix;                     /* source pixel */
                    476:        int charpad;                    /* inter-character pad */
                    477:        int spacepad;                   /* space-character pad */
                    478:        int dstx, dsty;                 /* destination */
                    479:        register CLIP *clips;           /* clipping rectangles */
                    480:        int clipcount;                  /* count of rectangles */
                    481:        int func;                       /* GX display function */
                    482:        int zmask;                      /* plane mask */
                    483: {
                    484:        srcpix = npix(srcpix);
                    485:        zmask = nmask(zmask);
                    486:        for (; --clipcount >= 0; clips++) {
                    487:            SetClip(clips);
                    488:            XTextMaskPad(t, dstx - clips->left, dsty - clips->top, string,
                    489:                         strlen, Xfont(font), charpad, spacepad, srcpix,
                    490:                         func, zmask);
                    491:        }
                    492: }
                    493: 
                    494: DrawCurve (verts, vertcount, xbase, ybase, srcpix, altpix, mode,
                    495:           bwidth, bheight, pat, patlen, patmul, clips, clipcount, func, zmask)
                    496:        Vertex *verts;                  /* vertexes */
                    497:        int vertcount;                  /* vertex count */
                    498:        int xbase, ybase;               /* draw origin */
                    499:        int srcpix;                     /* source pixel *
                    500:        int altpix;                     /* alternate source pixel */
                    501:        int mode;                       /* 0: solid, 1: dashed, 2: patterned */
                    502:        int bwidth;                     /* brush width */
                    503:        int bheight;                    /* brush height */
                    504:        int pat;                        /* pattern */
                    505:        int patlen;                     /* pattern length */
                    506:        int patmul;                     /* pattern repeat count */
                    507:        register CLIP *clips;           /* clipping rectangles */
                    508:        int clipcount;                  /* count of rectangles */
                    509:        int func;                       /* GX display function */
                    510:        int zmask;                      /* plane mask */
                    511: {
                    512:        srcpix = npix(srcpix);
                    513:        altpix = npix(altpix);
                    514:        zmask = nmask(zmask);
                    515:        for (; --clipcount >= 0; clips++) {
                    516:            SetClip(clips);
                    517:            PathOffsets(verts, vertcount,
                    518:                        xbase - clips->left, ybase - clips->top);
                    519:            xbase = clips->left;
                    520:            ybase = clips->top;
                    521:            switch (mode) {
                    522:            case DrawSolidLine:
                    523:                XDraw(t, verts, vertcount, bwidth, bheight, srcpix,
                    524:                      func, zmask);
                    525:                break;
                    526:            case DrawDashedLine:
                    527:                XDrawDashed(t, verts, vertcount, bwidth, bheight, srcpix,
                    528:                            XMakePattern(pat, patlen, patmul), func, zmask);
                    529:                break;
                    530:            case DrawPatternedLine:
                    531:                XDrawPatterned(t, verts, vertcount, bwidth, bheight, srcpix,
                    532:                               altpix, XMakePattern(pat, patlen, patmul),
                    533:                               func, zmask);
                    534:                break;
                    535:            }
                    536:        }
                    537: }
                    538: 
                    539: DrawFilled (verts, vertcount, xbase, ybase, srcpix, tile, xoff, yoff,
                    540:            clips, clipcount, func, zmask)
                    541:        Vertex *verts;                  /* vertexes */
                    542:        int vertcount;                  /* vertex count */
                    543:        int xbase, ybase;               /* draw origin */
                    544:        int srcpix;                     /* source pixel */
                    545:        PIXMAP *tile;                   /* optional tile or NULL */
                    546:        int xoff, yoff;                 /* tile origin */
                    547:        register CLIP *clips;           /* clipping rectangles */
                    548:        int clipcount;                  /* count of rectangles */
                    549:        int func;                       /* GX display function */
                    550:        int zmask;                      /* plane mask */
                    551: {
                    552:        if (tile)
                    553:            SetTileOrigin(tile, xoff, yoff);
                    554:        else
                    555:            srcpix = npix(srcpix);
                    556:        zmask = nmask(zmask);
                    557:        for (; --clipcount >= 0; clips++) {
                    558:            PathOffsets(verts, vertcount,
                    559:                        xbase - clips->left, ybase - clips->top);
                    560:            xbase = clips->left;
                    561:            ybase = clips->top;
                    562:            if (tile) {
                    563:                SetTileClip(clips);
                    564:                XDrawTiled(tt, verts, vertcount, Xpixmap(tile), func, zmask);
                    565:            } else {
                    566:                SetClip(clips);
                    567:                XDrawFilled(t, verts, vertcount, srcpix, func, zmask);
                    568:            }
                    569:        }
                    570: }
                    571: 
                    572: PathOffsets (verts, vertcount, xoff, yoff)
                    573:        register Vertex *verts;
                    574:        register int vertcount, xoff, yoff;
                    575: {
                    576:        for (; --vertcount >= 0; verts++) {
                    577:            if (!(verts->flags & VertexRelative)) {
                    578:                verts->x += xoff;
                    579:                verts->y += yoff;
                    580:            }
                    581:        }
                    582: }
                    583: 
                    584: SetClip (clip)
                    585:        register CLIP *clip;
                    586: {
                    587:        static CLIP normclip = {0, 0, 0, 0};
                    588: 
                    589:        if (clip->left != normclip.left || clip->top != normclip.top ||
                    590:            clip->width != normclip.width || clip->height != normclip.height) {
                    591:            XConfigureWindow(t, clip->left, clip->top,
                    592:                             clip->width, clip->height);
                    593:            normclip = *clip;
                    594:        }
                    595: }
                    596: 
                    597: SetTileClip (clip)
                    598:        register CLIP *clip;
                    599: {
                    600:        if (clip->left != tileclip.left || clip->top != tileclip.top ||
                    601:            clip->width != tileclip.width || clip->height != tileclip.height) {
                    602:            XConfigureWindow(tt, clip->left - tilex, clip->top - tiley,
                    603:                             clip->width, clip->height);
                    604:            tileclip = *clip;
                    605:        }
                    606: }
                    607: 
                    608: SetTileOrigin (tile, xoff, yoff)
                    609:        register PIXMAP *tile;
                    610:        register int xoff, yoff;
                    611: {
                    612:        if (tile->width) {
                    613:            xoff %= tile->width;
                    614:            if (xoff)
                    615:                xoff -= tile->width;
                    616:            yoff %= tile->height;
                    617:            if (yoff)
                    618:                yoff -= tile->height;
                    619:            if (xoff != tilex || yoff != tiley) {
                    620:                XConfigureWindow(ot, xoff, yoff,
                    621:                                 screen_width - xoff, screen_height - yoff);
                    622:                tileclip.left += (xoff - tilex);
                    623:                tileclip.top += (yoff - tiley);
                    624:                tilex = xoff;
                    625:                tiley = yoff;
                    626:            }
                    627:        }
                    628: }
                    629: 
                    630: PIXMAP *PixmapSave (srcx, srcy, width, height)
                    631:        int srcx, srcy;                 /* source */
                    632:        int width, height;
                    633: {
                    634:        Pixmap pix;
                    635:        PIXMAP *pm;
                    636: 
                    637:        pix = XPixmapSave(w, srcx, srcy, width, height);
                    638:        if (pix == NULL)
                    639:            return(NULL);
                    640:        pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
                    641:        pm->width = width;
                    642:        pm->height = height;
                    643:        pm->refcnt = 1;
                    644:        pm->data = (caddr_t) pix;
                    645:        IsTile(pm);
                    646:        return(pm);
                    647: }
                    648: 
                    649: PixmapGet (srcx, srcy, width, height, client, format, swapit)
                    650:        int srcx, srcy;                 /* source */
                    651:        int width, height;
                    652:        int client;                     /* file desc to write to */
                    653:        int format;                     /* 0: XY-format, 1: Z-format */
                    654:        int swapit;                     /* 1: swap shorts */
                    655: {
                    656:        int count;
                    657:        caddr_t data;
                    658: 
                    659:        if (format == XYFormat) {
                    660:            count = (XYPixmapSize(width, height, dev->planes) + 3) & ~3;
                    661:            data = Xalloc(count);
                    662:            if (XPixmapGetXY(w, srcx, srcy, width, height, data) == NULL)
                    663:                return;
                    664:        } else {
                    665:            if (dev->planes > 8)
                    666:                count = WZPixmapSize(width, height);
                    667:            else {
                    668:                count = BZPixmapSize(width, height);
                    669:                swapit = 0;
                    670:            }
                    671:            count = (count + 3) & ~3;
                    672:            data = Xalloc(count);
                    673:            if (XPixmapGetZ(w, srcx, srcy, width, height, data) == NULL)
                    674:                return;
                    675:        }
                    676:        FromPixmap(width, height, format, data);
                    677:        if (swapit)
                    678:            Swap_shorts(data, count >> 1);
                    679:        Write(client, data, count);
                    680:        free(data);
                    681: }
                    682: 
                    683: ResolveColor (red, green, blue)
                    684:        unsigned short *red, *green, *blue;     /* update in place */
                    685: {
                    686:        Color def;
                    687: 
                    688:        if (dev->entries) {
                    689:            def.pixel = extrapix;
                    690:            def.red = *red;
                    691:            def.green = *green;
                    692:            def.blue = *blue;
                    693:            XStoreColor(&def);
                    694:            XQueryColor(&def);
                    695:            *red = def.red;
                    696:            *green = def.green;
                    697:            *blue = def.blue;
                    698:        }
                    699: }
                    700: 
                    701: StoreColors (count, entries)
                    702:        int count;                      /* number of entries */
                    703:        register ColorDef *entries;
                    704: {
                    705:        register Color *ptr;
                    706:        register int n;
                    707:        static Color *ents = NULL;
                    708:        static entcnt = 0;
                    709: 
                    710:        if (count > entcnt) {
                    711:            free ((caddr_t) ents);
                    712:            ents = (Color *) Xalloc(count * sizeof(Color));
                    713:            entcnt = count;
                    714:        }
                    715:        for (ptr = ents, n = count; --n >= 0; entries++, ptr++) {
                    716:            ptr->pixel = npix(entries->pixel);
                    717:            ptr->red = entries->red;
                    718:            ptr->green = entries->green;
                    719:            ptr->blue = entries->blue;
                    720:        }
                    721:        XStoreColors(count, ents);
                    722: }
                    723: 
                    724: FONT *GetFont (name)
                    725:        char *name;                     /* font or file name */
                    726: {
                    727:        register FontInfo *info;
                    728:        register FONT *fd;
                    729:        char *fname;
                    730: 
                    731:        info = XOpenFont(name);
                    732:        if (info == NULL) {
                    733:            errno = EINVAL;
                    734:            return(NULL);
                    735:        }
                    736:        fd = (FONT *) Xalloc(sizeof(FONT));
                    737:        fname = Xalloc(strlen(name) + 1);
                    738:        strcpy(fname, name);
                    739:        fd->name = fname;
                    740:        fd->first = info->firstchar;
                    741:        fd->last = info->lastchar;
                    742:        fd->space = ' ';
                    743:        fd->height = info->height;
                    744:        fd->avg_width = info->width;
                    745:        fd->fixed = info->fixedwidth;
                    746:        fd->base = info->baseline;
                    747:        fd->refcnt = 1;
                    748:        fd->data = (caddr_t) info;
                    749:        return(fd);
                    750: }
                    751: 
                    752: FreeFont (font)
                    753:        FONT *font;
                    754: {
                    755:        XCloseFont(Xfinf(font));
                    756:        free(font->name);
                    757:        free((caddr_t) font);
                    758: }
                    759: 
                    760: CharWidth (c, font)
                    761:        unsigned c;                     /* character */
                    762:        register FONT *font;            /* font */
                    763: {
                    764:        if (c < font->first || c > font->last)
                    765:            return(0);
                    766:        else if (font->fixed)
                    767:            return(font->avg_width);
                    768:        else
                    769:            return(Xfinf(font)->widths[c - font->first]);
                    770: }
                    771: 
                    772: TextWidth (string, strlen, spacepad, font)
                    773:        char *string;                   /* character string */
                    774:        int strlen;                     /* string length */
                    775:        int spacepad;                   /* space-character pad */
                    776:        register FONT *font;            /* font */
                    777: {
                    778:        register u_char *strptr = (u_char *) string;
                    779:        short c;
                    780:        register short *widths;
                    781:        int width = 0;
                    782: 
                    783:        if (font->fixed) {
                    784:            width = strlen * font->avg_width;
                    785:            if (spacepad) {
                    786:                while (--strlen >= 0)
                    787:                    if (*strptr++ == font->space)
                    788:                        width += spacepad;
                    789:            }
                    790:        } else {
                    791:            widths = Xfinf(font)->widths;
                    792:            while (--strlen >= 0) {
                    793:                c = *strptr++;
                    794:                if (c >= font->first && c <= font->last) {
                    795:                    if (c == font->space)
                    796:                        width += spacepad;
                    797:                    width += widths[c - font->first];
                    798:                }
                    799:            }
                    800:        }
                    801:        return (width);
                    802: }
                    803: 
                    804: BITMAP *StoreBitmap (width, height, data)
                    805:        int width;                      /* bitmap width */
                    806:        int height;                     /* bitmap height */
                    807:        char *data;                     /* bitmap data */
                    808: {
                    809:        Bitmap bitmap;
                    810:        register BITMAP *bm;
                    811: 
                    812:        bitmap = XStoreBitmap(width, height, data);
                    813:        if (bitmap == NULL)
                    814:            return(NULL);
                    815:        bm = (BITMAP *) Xalloc(sizeof(BITMAP));
                    816:        bm->width = width;
                    817:        bm->height = height;
                    818:        bm->refcnt = 1;
                    819:        bm->data = (caddr_t) bitmap;
                    820:        return(bm);
                    821: }
                    822: 
                    823: FreeBitmap (bitmap)
                    824:        BITMAP *bitmap;
                    825: {
                    826:        XFreeBitmap(Xbitmap(bitmap));
                    827:        free((caddr_t) bitmap);
                    828: }
                    829: 
                    830: BITMAP *CharBitmap (c, font)
                    831:        unsigned c;                     /* character */
                    832:        register FONT *font;            /* font */
                    833: {
                    834:        Bitmap bitmap;
                    835:        register BITMAP *bm;
                    836: 
                    837:        bitmap = XCharBitmap(Xfont(font), (int) c);
                    838:        if (bitmap == NULL)
                    839:            return(NULL);
                    840:        bm = (BITMAP *) Xalloc(sizeof(BITMAP));
                    841:        bm->width = CharWidth(c, font);
                    842:        bm->height = Xfinf(font)->height;
                    843:        bm->refcnt = 1;
                    844:        bm->data = (caddr_t) bitmap;
                    845:        return(bm);
                    846: }
                    847: 
                    848: PIXMAP *StorePixmap (width, height, format, data)
                    849:        int width;                      /* pixmap width */
                    850:        int height;                     /* pixmap height */
                    851:        int format;                     /* 0: XY-format, 1: Z-format */
                    852:        char *data;                     /* pixmap data */
                    853: {
                    854:        Pixmap pix;
                    855:        register PIXMAP *pm;
                    856: 
                    857:        ToPixmap(width, height, format, data);
                    858:        if (format == XYFormat)
                    859:            pix = XStorePixmapXY(width, height, data);
                    860:        else
                    861:            pix = XStorePixmapZ(width, height, data);
                    862:        if (pix == NULL)
                    863:            return(NULL);
                    864:        pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
                    865:        pm->width = width;
                    866:        pm->height = height;
                    867:        pm->refcnt = 1;
                    868:        pm->data = (caddr_t) pix;
                    869:        IsTile(pm);
                    870:        return(pm);
                    871: }
                    872: 
                    873: FreePixmap (pixmap)
                    874:        PIXMAP *pixmap;
                    875: {
                    876:        XFreePixmap(Xpixmap(pixmap));
                    877:        free((caddr_t) pixmap);
                    878: }
                    879: 
                    880: ToPixmap (width, height, format, data)
                    881:        int width, height, format;
                    882:        char *data;
                    883: {
                    884:        register int n;
                    885:        int shift;
                    886:        register u_short *sptr;
                    887:        register u_char *cptr;
                    888:        register char *ptr;
                    889: 
                    890:        if (dev->entries == 0)
                    891:            return;
                    892:        if (format == XYFormat) {
                    893:            n = BitmapSize(width, height);
                    894:            if (pixshift) {
                    895:                ptr = data + XYPixmapSize(width, height, dev->planes);
                    896:                shift = XYPixmapSize(width, height, pixplanes);
                    897:                bcopy(ptr - shift,
                    898:                      ptr - (shift + XYPixmapSize(width, height, pixshift)),
                    899:                      shift);
                    900:                for (shift = 0, ptr -= n;
                    901:                     shift < pixshift;
                    902:                     shift++, ptr -= n) {
                    903:                    if (basepix & (1 << shift))
                    904:                        AllOnes(ptr, width, height);
                    905:                    else
                    906:                        bzero(ptr, n);
                    907:                }
                    908:            }
                    909:            for (shift = dev->planes, ptr = data;
                    910:                 --shift >= pixshift + pixplanes;
                    911:                 ptr += n) {
                    912:                if (basepix & (1 << shift))
                    913:                    AllOnes(ptr, width, height);
                    914:            }
                    915:        } else if (dev->planes > 8) {
                    916:            for (n = WZPixmapSize(width, height) >> 1, sptr = (u_short *) data;
                    917:                 --n >= 0;
                    918:                 sptr++)            
                    919:                *sptr = npix(*sptr);
                    920:        } else {
                    921:            for (n = BZPixmapSize(width, height), cptr = (u_char *) data;
                    922:                 --n >= 0;
                    923:                 cptr++)
                    924:                *cptr = npix(*cptr);
                    925:        }
                    926: }
                    927: 
                    928: AllOnes (data, width, height)
                    929:        register char *data;
                    930:        int width, height;
                    931: {
                    932:        register int n, cnt;
                    933:        register char *ptr;
                    934: 
                    935:        n = BitmapSize(width, 1);
                    936:        for (ptr = data, cnt = n; --cnt >= 0; )
                    937:            *ptr++ = ~0;
                    938:        for (ptr = data + n, cnt = height; --cnt > 0; ptr += n)
                    939:            bcopy(data, ptr, n);
                    940: }
                    941: 
                    942: FromPixmap (width, height, format, data)
                    943:        int width, height, format;
                    944:        register char *data;
                    945: {
                    946:        register int n;
                    947:        register u_short *sptr;
                    948:        register u_char *cptr;
                    949:        register char *ptr;
                    950:        int cnt, shift;
                    951: 
                    952:        if (dev->entries == 0)
                    953:            return;
                    954:        if (format == XYFormat) {
                    955:            if (pixshift) {
                    956:                cnt = BitmapSize(width, height);
                    957:                shift = XYPixmapSize(width, height, pixshift);
                    958:                for (ptr = data + XYPixmapSize(width, height, dev->planes) - cnt,
                    959:                     n = pixshift;
                    960:                     --n >= 0;
                    961:                     ptr -= cnt)
                    962:                    bcopy(ptr - shift, ptr, cnt);
                    963:            }
                    964:            bzero(data, XYPixmapSize(width, height, dev->planes - pixplanes));
                    965:        } else if (dev->planes > 8) {
                    966:            for (n = WZPixmapSize(width, height) >> 1, sptr = (u_short *) data;
                    967:                 --n >= 0;
                    968:                 sptr++)
                    969:                *sptr = opix(*sptr);
                    970:        } else {
                    971:            for (n = BZPixmapSize(width, height), cptr = (u_char *) data;
                    972:                 --n >= 0;
                    973:                 cptr++)
                    974:                *cptr = opix(*cptr);
                    975:        }
                    976: }
                    977: 
                    978: PIXMAP *MakePixmap (xymask, fore, back)
                    979:        BITMAP *xymask;                 /* mask or NULL */
                    980:        int fore;                       /* foreground pixel */
                    981:        int back;                       /* background pixel */
                    982: {
                    983:        Pixmap pix;
                    984:        register PIXMAP *pm;
                    985: 
                    986:        pix = XMakePixmap(xymask ? Xbitmap(xymask) : NULL,
                    987:                          npix(fore), npix(back));
                    988:        if (pix == NULL)
                    989:            return(NULL);
                    990:        pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
                    991:        pm->refcnt = 1;
                    992:        pm->data = (caddr_t) pix;
                    993:        if (xymask) {
                    994:            pm->width = xymask->width;
                    995:            pm->height = xymask->height;
                    996:            IsTile(pm);
                    997:        } else {
                    998:            pm->width = 0;
                    999:            pm->height = 0;
                   1000:            pm->tile = 1;
                   1001:        }
                   1002:        return(pm);
                   1003: }
                   1004: 
                   1005: IsTile (pm)
                   1006:        PIXMAP *pm;
                   1007: {
                   1008:        int width, height;
                   1009: 
                   1010:        XQueryTileShape(pm->width, pm->height, &width, &height);
                   1011:        if (pm->width == width && pm->height == height)
                   1012:            pm->tile = 1;
                   1013:        else
                   1014:            pm->tile = 0;
                   1015: }
                   1016: 
                   1017: QueryShape (shape, width, height)
                   1018:        int shape;                      /* 0: cursor, 1: tile, 2: brush */
                   1019:        short *width, *height;          /* update in place */
                   1020: {
                   1021:        int rwidth, rheight;
                   1022: 
                   1023:        switch (shape) {
                   1024:        case CursorShape:
                   1025:            XQueryCursorShape(*width, *height, &rwidth, &rheight);
                   1026:            break;
                   1027:        case TileShape:
                   1028:            XQueryTileShape(*width, *height, &rwidth, &rheight);
                   1029:            break;
                   1030:        case BrushShape:
                   1031:            XQueryBrushShape(*width, *height, &rwidth, &rheight);
                   1032:            break;
                   1033:        }
                   1034:        *width = rwidth;
                   1035:        *height = rheight;
                   1036: }
                   1037: 
                   1038: CURSOR *StoreCursor (func, image, fore, back, mask, xoff, yoff)
                   1039:        int func;                       /* GX display function */
                   1040:        BITMAP *image;                  /* cursor image */
                   1041:        int fore;                       /* foreground pixel */
                   1042:        int back;                       /* background pixel */
                   1043:        BITMAP *mask;                   /* cursor mask or NULL */
                   1044:        int xoff, yoff;                 /* tip */
                   1045: {
                   1046:        Cursor cursor;
                   1047:        register CURSOR *cr;
                   1048:        int width, height;
                   1049: 
                   1050:        cursor = XStoreCursor(Xbitmap(image), mask ? Xbitmap(mask) : NULL,
                   1051:                              xoff, yoff, npix(fore), npix(back), func);
                   1052:        if (cursor == NULL)
                   1053:            return(NULL);
                   1054:        XQueryCursorShape(image->width, image->height, &width, &height);
                   1055:        cr = (CURSOR *) Xalloc(sizeof(CURSOR));
                   1056:        cr->width = width;
                   1057:        cr->height = height;
                   1058:        cr->xoff = xoff;
                   1059:        cr->yoff = yoff;
                   1060:        cr->xmin = xoff;
                   1061:        cr->ymin = yoff;
                   1062:        cr->xmax = screen_width - (width - xoff);
                   1063:        cr->ymax = screen_height - (height - yoff);
                   1064:        cr->refcnt = 1;
                   1065:        cr->data = (caddr_t) cursor;
                   1066:        return(cr);
                   1067: }
                   1068: 
                   1069: FreeCursor (cursor)
                   1070:        CURSOR *cursor;
                   1071: {
                   1072:        XFreeCursor(Xcursor(cursor));
                   1073:        free((caddr_t) cursor);
                   1074: }
                   1075: 
                   1076: LoadCursor (cursor)
                   1077:        CURSOR *cursor;
                   1078: {
                   1079:        if (cursor->xoff != cursor_x || cursor->yoff != cursor_y) {
                   1080:            XCondWarpMouse(w, mouse.x + cursor->xoff, mouse.y + cursor->yoff,
                   1081:                           w, mouse.x + cursor_x, mouse.y + cursor_y, 1, 1);
                   1082:            cursor_x = cursor->xoff;
                   1083:            cursor_y = cursor->yoff;
                   1084:        }
                   1085:        XDefineCursor(w, Xcursor(cursor));
                   1086: }
                   1087: 
                   1088: /*ARGSUSED*/
                   1089: SetMouseCharacteristics (threshold, acceleration)
                   1090:        int threshold, acceleration;
                   1091: {
                   1092: }
                   1093: 
                   1094: SetCursorPosition (pos)
                   1095:        vsCursor *pos;
                   1096: {
                   1097:        XCondWarpMouse(w, pos->x + cursor_x, pos->y + cursor_y, w, 0, 0, 0, 0);
                   1098:        mouse = *pos;
                   1099: }
                   1100: 
                   1101: /*ARGSUSED*/
                   1102: SetAutoRepeat (onoff)
                   1103:        int onoff;                      /* 0: off, 1: on */
                   1104: {
                   1105: }
                   1106: 
                   1107: /*ARGSUSED*/
                   1108: SetKeyClick (volume)
                   1109:        int volume;                     /* 0: off, 1-8: on */
                   1110: {
                   1111: }
                   1112: 
                   1113: SoundBell (volume)
                   1114:        int volume;                     /* 0-7 */
                   1115: {
                   1116:        XFeep(volume);
                   1117: }
                   1118: 
                   1119: /*ARGSUSED*/
                   1120: SetLockLED (onoff)
                   1121:        int onoff;                      /* 0: off, 1: on */
                   1122: {
                   1123: }
                   1124: 
                   1125: SetVideo (onoff)
                   1126:        int onoff;                      /* 0: off, 1: on */
                   1127: {
                   1128:        return(onoff - 1);
                   1129: }

unix.superglobalmegacorp.com

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