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

Defined functions

AllOnes defined in line 914; used 2 times
AllocateSpace defined in line 267; never used
BitmapBitsPut defined in line 370; never used
ButtonTransition defined in line 195; used 2 times
CharBitmap defined in line 816; never used
CharWidth defined in line 746; used 1 times
CopyArea defined in line 395; never used
DisplayDead defined in line 258; never used
DrawCurve defined in line 480; never used
DrawFilled defined in line 525; never used
FreeBitmap defined in line 809; never used
FreeCursor defined in line 1055; never used
FreeFont defined in line 738; never used
FreePixmap defined in line 859; never used
FromPixmap defined in line 928; used 1 times
GetFont defined in line 710; never used
InitDisplay defined in line 220; never used
InitMouse defined in line 263; never used
InputReader defined in line 92; used 1 times
IsTile defined in line 991; used 3 times
KeyTransition defined in line 164; used 2 times
LoadCursor defined in line 1062; never used
MakePixmap defined in line 964; never used
OpenDisplay defined in line 47; never used
PathOffsets defined in line 558; used 2 times
PixFill defined in line 280; never used
PixmapBitsPut defined in line 341; never used
PixmapGet defined in line 635; never used
PixmapPut defined in line 322; never used
PixmapSave defined in line 616; never used
PrintText defined in line 431; never used
PrintTextMask defined in line 456; never used
ProcessInput defined in line 41; never used
QueryShape defined in line 1003; never used
ResolveColor defined in line 669; never used
SetAutoRepeat defined in line 1088; never used
SetClip defined in line 570; used 8 times
SetCursorPosition defined in line 1080; never used
SetKeyClick defined in line 1094; never used
SetLockLED defined in line 1106; never used
SetMouseCharacteristics defined in line 1075; never used
SetTileClip defined in line 583; used 2 times
SetTileOrigin defined in line 594; used 2 times
SetVideo defined in line 1111; never used
SoundBell defined in line 1099; never used
StoreBitmap defined in line 790; never used
StoreColors defined in line 687; never used
StoreCursor defined in line 1024; never used
StorePixmap defined in line 834; never used
TextWidth defined in line 758; never used
TileFill defined in line 300; never used
ToPixmap defined in line 866; used 2 times

Defined variables

basepix defined in line 30; used 5 times
cursor_x defined in line 37; used 5 times
cursor_y defined in line 37; used 5 times
dev defined in line 38; used 12 times
extrapix defined in line 27; used 3 times
mbox defined in line 36; used 7 times
mouse defined in line 35; used 26 times
ot defined in line 26; used 5 times
pixplanes defined in line 28; used 10 times
pixshift defined in line 29; used 11 times
screen_height defined in line 31; used 8 times
screen_width defined in line 31; used 8 times
t defined in line 26; used 14 times
tileclip defined in line 34; used 7 times
tilex defined in line 32; used 4 times
tiley defined in line 33; used 4 times
tt defined in line 26; used 5 times
w defined in line 26; used 14 times

Defined macros

Xbitmap defined in line 18; used 9 times
Xcursor defined in line 21; used 2 times
Xfinf defined in line 19; used 5 times
Xfont defined in line 20; used 3 times
Xpixmap defined in line 17; used 4 times
nmask defined in line 24; used 9 times
npix defined in line 22; used 16 times
opix defined in line 23; used 2 times
Last modified: 1986-02-01
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 3170
Valid CSS Valid XHTML 1.0 Strict