Annotation of 43BSDTahoe/new/X/libnest/nest.c, revision 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.