Annotation of researchv9/X11/src/X.V11R1/server/ddx/apollo/apolloGC.c, revision 1.1

1.1     ! root        1: /*-
        !             2:  * apolloGC.c --
        !             3:  *     Functions to support the meddling with GC's we do to preserve
        !             4:  *     the software cursor...
        !             5:  *
        !             6:  * Copyright (c) 1987 by the Regents of the University of California
        !             7:  *
        !             8:  * Permission to use, copy, modify, and distribute this
        !             9:  * software and its documentation for any purpose and without
        !            10:  * fee is hereby granted, provided that the above copyright
        !            11:  * notice appear in all copies.  The University of California
        !            12:  * makes no representations about the suitability of this
        !            13:  * software for any purpose.  It is provided "as is" without
        !            14:  * express or implied warranty.
        !            15:  *
        !            16:  *
        !            17:  */
        !            18: 
        !            19: #include "apollo.h"
        !            20: #include    "../mi/mifpoly.h"          /* for SppPointPtr */
        !            21: 
        !            22: apProcPtrs apProcs;
        !            23: 
        !            24: /*
        !            25:  * Overlap BoxPtr and Box elements
        !            26:  */
        !            27: #define BOX_OVERLAP(pCbox,X1,Y1,X2,Y2) \
        !            28:        (((pCbox)->x1 <= (X2)) && ((X1) <= (pCbox)->x2) && \
        !            29:         ((pCbox)->y1 <= (Y2)) && ((Y1) <= (pCbox)->y2))
        !            30: 
        !            31: /*
        !            32:  * Overlap BoxPtr, origins, and rectangle
        !            33:  */
        !            34: #define ORG_OVERLAP(pCbox,xorg,yorg,x,y,w,h) \
        !            35:     BOX_OVERLAP((pCbox),(x)+(xorg),(y)+(yorg),(x)+(xorg)+(w),(y)+(yorg)+(h))
        !            36: 
        !            37: /*
        !            38:  * Overlap BoxPtr, origins and RectPtr
        !            39:  */
        !            40: #define ORGRECT_OVERLAP(pCbox,xorg,yorg,pRect) \
        !            41:     ORG_OVERLAP((pCbox),(xorg),(yorg),(pRect)->x,(pRect)->y,(pRect)->width, \
        !            42:                (pRect)->height)
        !            43: /*
        !            44:  * Overlap BoxPtr and horizontal span
        !            45:  */
        !            46: #define SPN_OVERLAP(pCbox,y,x,w) BOX_OVERLAP((pCbox),(x),(y),(x)+(w),(y))
        !            47: 
        !            48: 
        !            49: #ifdef notdef
        !            50: #define        COMPARE_GCS(g1, g2)     compare_gcs(g1, g2)
        !            51: 
        !            52: static
        !            53: compare_gcs(g1, g2)
        !            54: GCPtr g1, g2;
        !            55: {
        !            56:     if (g1->pScreen != g2->pScreen) FatalError("GC and Shadow mis-match - pScreen\n");
        !            57:     if (g1->depth != g2->depth) FatalError("GC and Shadow mis-match - depth\n");
        !            58: #ifdef notdef
        !            59:     if (g1->serialNumber != g2->serialNumber) FatalError("GC and Shadow mis-match - serialNumber\n");
        !            60: #endif
        !            61:     if (g1->alu != g2->alu) FatalError("GC and Shadow mis-match - alu\n");
        !            62:     if (g1->planemask != g2->planemask) FatalError("GC and Shadow mis-match - planemask\n");
        !            63:     if (g1->fgPixel != g2->fgPixel) FatalError("GC and Shadow mis-match - fgPixel\n");
        !            64:     if (g1->bgPixel != g2->bgPixel) FatalError("GC and Shadow mis-match - bgPixel\n");
        !            65:     if (g1->lineWidth != g2->lineWidth) FatalError("GC and Shadow mis-match - lineWidth\n");
        !            66:     if (g1->lineStyle != g2->lineStyle) FatalError("GC and Shadow mis-match - lineStyle\n");
        !            67:     if (g1->capStyle != g2->capStyle) FatalError("GC and Shadow mis-match - capStyle\n");
        !            68:     if (g1->joinStyle != g2->joinStyle) FatalError("GC and Shadow mis-match - joinStyle\n");
        !            69:     if (g1->fillStyle != g2->fillStyle) FatalError("GC and Shadow mis-match - fillStyle\n");
        !            70:     if (g1->fillRule != g2->fillRule) FatalError("GC and Shadow mis-match - fillRule\n");
        !            71:     if (g1->arcMode != g2->arcMode) FatalError("GC and Shadow mis-match - arcMode\n");
        !            72:     if (g1->tile != g2->tile) FatalError("GC and Shadow mis-match - tile\n");
        !            73:     if (g1->stipple != g2->stipple) FatalError("GC and Shadow mis-match - stipple\n");
        !            74:     if (g1->patOrg.x != g2->patOrg.x) FatalError("GC and Shadow mis-match - patOrg.x\n");
        !            75:     if (g1->patOrg.y != g2->patOrg.y) FatalError("GC and Shadow mis-match - patOrg.y\n");
        !            76:     if (g1->font != g2->font) FatalError("GC and Shadow mis-match - font\n");
        !            77:     if (g1->subWindowMode != g2->subWindowMode) FatalError("GC and Shadow mis-match - subWindowMode\n");
        !            78:     if (g1->graphicsExposures != g2->graphicsExposures) FatalError("GC and Shadow mis-match - graphicsExposures\n");
        !            79:     if (g1->clipOrg.x != g2->clipOrg.x) FatalError("GC and Shadow mis-match - clipOrg.x\n");
        !            80:     if (g1->clipOrg.y != g2->clipOrg.y) FatalError("GC and Shadow mis-match - clipOrg.y\n");
        !            81: #ifdef notdef
        !            82:     if (g1->clientClip != g2->clientClip) FatalError("GC and Shadow mis-match - clientClip\n");
        !            83: #endif
        !            84:     if (g1->clientClipType != g2->clientClipType) FatalError("GC and Shadow mis-match - clientClipType\n");
        !            85:     if (g1->dashOffset != g2->dashOffset) FatalError("GC and Shadow mis-match - dashOffset\n");
        !            86:     if (g1->numInDashList != g2->numInDashList) FatalError("GC and Shadow mis-match - numInDashList\n");
        !            87: #ifdef notdef
        !            88:     if (g1->dash != g2->dash) FatalError("GC and Shadow mis-match - dash\n");
        !            89:     if (g1->stateChanges != g2->stateChanges) FatalError("GC and Shadow mis-match - stateChanges\n");
        !            90: #endif
        !            91:     if (g1->lastWinOrg.x != g2->lastWinOrg.x) FatalError("GC and Shadow mis-match - lastWinOrg.x\n");
        !            92:     if (g1->lastWinOrg.y != g2->lastWinOrg.y) FatalError("GC and Shadow mis-match - lastWinOrg.y\n");
        !            93:     if (g1->miTranslate != g2->miTranslate) FatalError("GC and Shadow mis-match - miTranslate\n");
        !            94: 
        !            95: }
        !            96: #else
        !            97: #define        COMPARE_GCS(g1, g2)
        !            98: #endif
        !            99: 
        !           100: 
        !           101: /*-
        !           102:  *-----------------------------------------------------------------------
        !           103:  * apSaveCursorBox --
        !           104:  *     Given an array of points, figure out the bounding box for the
        !           105:  *     series and remove the cursor if it overlaps that box.
        !           106:  *
        !           107:  * Results:
        !           108:  *
        !           109:  * Side Effects:
        !           110:  *
        !           111:  *-----------------------------------------------------------------------
        !           112:  */
        !           113: void
        !           114: apSaveCursorBox (xorg, yorg, mode, pPts, nPts, pCursorBox)
        !           115:     register int           xorg;           /* X-Origin for points */
        !           116:     register int           yorg;           /* Y-Origin for points */
        !           117:     int                            mode;           /* CoordModeOrigin or
        !           118:                                             * CoordModePrevious */
        !           119:     register DDXPointPtr    pPts;          /* Array of points */
        !           120:     int                            nPts;           /* Number of points */
        !           121:     register BoxPtr        pCursorBox;     /* Bounding box for cursor */
        !           122: {
        !           123:     register int           minx,
        !           124:                            miny,
        !           125:                            maxx,
        !           126:                            maxy;
        !           127: 
        !           128:     minx = maxx = pPts->x + xorg;
        !           129:     miny = maxy = pPts->y + yorg;
        !           130: 
        !           131:     pPts++;
        !           132:     nPts--;
        !           133: 
        !           134:     if (mode == CoordModeOrigin) {
        !           135:        while (nPts--) {
        !           136:            minx = min(minx, pPts->x + xorg);
        !           137:            maxx = max(maxx, pPts->x + xorg);
        !           138:            miny = min(miny, pPts->y + yorg);
        !           139:            maxy = max(maxy, pPts->y + yorg);
        !           140:            pPts++;
        !           141:        }
        !           142:     } else {
        !           143:        xorg = minx;
        !           144:        yorg = miny;
        !           145:        while (nPts--) {
        !           146:            minx = min(minx, pPts->x + xorg);
        !           147:            maxx = max(maxx, pPts->x + xorg);
        !           148:            miny = min(miny, pPts->y + yorg);
        !           149:            maxy = max(maxy, pPts->y + yorg);
        !           150:            xorg += pPts->x;
        !           151:            yorg += pPts->y;
        !           152:            pPts++;
        !           153:        }
        !           154:     }
        !           155:     if (BOX_OVERLAP(pCursorBox,minx,miny,maxx,maxy)) {
        !           156:        apRemoveCursor(TRUE);
        !           157:     }
        !           158: }
        !           159:                       
        !           160: /*-
        !           161:  *-----------------------------------------------------------------------
        !           162:  * apFillSpans --
        !           163:  *     Remove the cursor if any of the spans overlaps the area covered
        !           164:  *     by the cursor. This assumes the points have been translated
        !           165:  *     already, though perhaps it shouldn't...
        !           166:  *
        !           167:  * Results:
        !           168:  *     None.
        !           169:  *
        !           170:  * Side Effects:
        !           171:  *
        !           172:  *-----------------------------------------------------------------------
        !           173:  */
        !           174: void
        !           175: apFillSpans(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
        !           176:     DrawablePtr pDrawable;
        !           177:     GCPtr      pGC;
        !           178:     int                nInit;                  /* number of spans to fill */
        !           179:     DDXPointPtr pptInit;               /* pointer to list of start points */
        !           180:     int                *pwidthInit;            /* pointer to list of n widths */
        !           181:     int        fSorted;
        !           182: {
        !           183:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           184: 
        !           185:     if (pDrawable->type == DRAWABLE_WINDOW) {
        !           186:        BoxRec    cursorBox;
        !           187: 
        !           188:        if (apCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           189:            register DDXPointPtr    pts;
        !           190:            register int            *widths;
        !           191:            register int            nPts;
        !           192: 
        !           193:            for (pts = pptInit, widths = pwidthInit, nPts = nInit;
        !           194:                 nPts--;
        !           195:                 pts++, widths++) {
        !           196:                     if (SPN_OVERLAP(&cursorBox,pts->y,pts->x,*widths)) {
        !           197:                         apRemoveCursor(TRUE);
        !           198:                         break;
        !           199:                     }
        !           200:            }
        !           201:        }
        !           202:     }
        !           203: 
        !           204:     COMPARE_GCS(pGC,pShadowGC);
        !           205:     (* pShadowGC->FillSpans)(pDrawable, pShadowGC, nInit, pptInit,
        !           206:                             pwidthInit, fSorted);
        !           207: }
        !           208: 
        !           209: /*-
        !           210:  *-----------------------------------------------------------------------
        !           211:  * apSetSpans --
        !           212:  *     Remove the cursor if any of the horizontal segments overlaps
        !           213:  *     the area covered by the cursor. This also assumes the spans
        !           214:  *     have been translated from the window's coordinates to the
        !           215:  *     screen's.
        !           216:  * Results:
        !           217:  *     None.
        !           218:  *
        !           219:  * Side Effects:
        !           220:  *
        !           221:  *-----------------------------------------------------------------------
        !           222:  */
        !           223: void
        !           224: apSetSpans(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted)
        !           225:     DrawablePtr                pDrawable;
        !           226:     GCPtr              pGC;
        !           227:     int                        *psrc;
        !           228:     register DDXPointPtr ppt;
        !           229:     int                        *pwidth;
        !           230:     int                        nspans;
        !           231:     int                        fSorted;
        !           232: {
        !           233:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           234: 
        !           235:     if (pDrawable->type == DRAWABLE_WINDOW) {
        !           236:        BoxRec    cursorBox;
        !           237: 
        !           238:        if (apCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           239:            register DDXPointPtr    pts;
        !           240:            register int            *widths;
        !           241:            register int            nPts;
        !           242: 
        !           243:            for (pts = ppt, widths = pwidth, nPts = nspans;
        !           244:                 nPts--;
        !           245:                 pts++, widths++) {
        !           246:                     if (SPN_OVERLAP(&cursorBox,pts->y,pts->x,*widths)) {
        !           247:                         apRemoveCursor(TRUE);
        !           248:                         break;
        !           249:                     }
        !           250:            }
        !           251:        }
        !           252:     }
        !           253: 
        !           254:     COMPARE_GCS(pGC,pShadowGC);
        !           255:     (* pShadowGC->SetSpans) (pDrawable, pShadowGC, psrc, ppt, pwidth,
        !           256:                             nspans, fSorted);
        !           257: }
        !           258: 
        !           259: /*-
        !           260:  *-----------------------------------------------------------------------
        !           261:  * apGetSpans --
        !           262:  *     Remove the cursor if any of the desired spans overlaps the cursor.
        !           263:  *
        !           264:  * Results:
        !           265:  *
        !           266:  * Side Effects:
        !           267:  *
        !           268:  *-----------------------------------------------------------------------
        !           269:  */
        !           270: unsigned int *
        !           271: apGetSpans(pDrawable, wMax, ppt, pwidth, nspans)
        !           272:     DrawablePtr                pDrawable;      /* drawable from which to get bits */
        !           273:     int                        wMax;           /* largest value of all *pwidths */
        !           274:     register DDXPointPtr ppt;          /* points to start copying from */
        !           275:     int                        *pwidth;        /* list of number of bits to copy */
        !           276:     int                        nspans;         /* number of scanlines to copy */
        !           277: {
        !           278:     if (pDrawable->type == DRAWABLE_WINDOW) {
        !           279:        BoxRec    cursorBox;
        !           280: 
        !           281:        if (apCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           282:            register DDXPointPtr    pts;
        !           283:            register int            *widths;
        !           284:            register int            nPts;
        !           285:            register int            xorg,
        !           286:                                    yorg;
        !           287: 
        !           288:            xorg = ((WindowPtr)pDrawable)->absCorner.x;
        !           289:            yorg = ((WindowPtr)pDrawable)->absCorner.y;
        !           290: 
        !           291:            for (pts = ppt, widths = pwidth, nPts = nspans;
        !           292:                 nPts--;
        !           293:                 pts++, widths++) {
        !           294:                     if (SPN_OVERLAP(&cursorBox,pts->y+yorg,
        !           295:                                     pts->x+xorg,*widths)) {
        !           296:                                         apRemoveCursor(TRUE);
        !           297:                                         break;
        !           298:                     }
        !           299:            }
        !           300:        }
        !           301:     }
        !           302: 
        !           303:     /*
        !           304:      * XXX: Because we have no way to get at the GC used to call us,
        !           305:      * we must rely on the GetSpans vector never changing and stick it
        !           306:      * in the fbFd structure. Gross.
        !           307:      */
        !           308:     return (* apProcs.GetSpans) (pDrawable, wMax, ppt, pwidth, nspans);
        !           309: }
        !           310: 
        !           311: /*-
        !           312:  *-----------------------------------------------------------------------
        !           313:  * apPutImage --
        !           314:  *     Remove the cursor if it is in the way of the image to be
        !           315:  *     put down...
        !           316:  *
        !           317:  * Results:
        !           318:  *     None.
        !           319:  *
        !           320:  * Side Effects:
        !           321:  *
        !           322:  *-----------------------------------------------------------------------
        !           323:  */
        !           324: void
        !           325: apPutImage(pDst, pGC, depth, x, y, w, h, leftPad, format, pBits)
        !           326:     DrawablePtr          pDst;
        !           327:     GCPtr        pGC;
        !           328:     int                  depth;
        !           329:     int                  x;
        !           330:     int                  y;
        !           331:     int                  w;
        !           332:     int                  h;
        !           333:     int                  format;
        !           334:     char         *pBits;
        !           335: {
        !           336:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           337: 
        !           338:     if (pDst->type == DRAWABLE_WINDOW) {
        !           339:        BoxRec    cursorBox;
        !           340:        if (apCursorLoc (pDst->pScreen, &cursorBox)) {
        !           341:            register WindowPtr pWin = (WindowPtr)pDst;
        !           342: 
        !           343:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           344:                            x,y,w,h)) {
        !           345:                                apRemoveCursor(TRUE);
        !           346:            }
        !           347:        }
        !           348:     }
        !           349: 
        !           350:     COMPARE_GCS(pGC,pShadowGC);
        !           351:     (* pShadowGC->PutImage) (pDst, pShadowGC, depth, x, y, w, h,
        !           352:                             leftPad, format, pBits);
        !           353: }
        !           354: 
        !           355: /*-
        !           356:  *-----------------------------------------------------------------------
        !           357:  * apGetImage --
        !           358:  *     Remove the cursor if it overlaps the image to be gotten.
        !           359:  *
        !           360:  * Results:
        !           361:  *     None.
        !           362:  *
        !           363:  * Side Effects:
        !           364:  *
        !           365:  *-----------------------------------------------------------------------
        !           366:  */
        !           367: void
        !           368: apGetImage (pSrc, x, y, w, h, format, planeMask, pBits)
        !           369:     DrawablePtr          pSrc;
        !           370:     int                  x;
        !           371:     int                  y;
        !           372:     int                  w;
        !           373:     int                  h;
        !           374:     unsigned int  format;
        !           375:     unsigned int  planeMask;
        !           376:     int                  *pBits;
        !           377: {
        !           378:     if (pSrc->type == DRAWABLE_WINDOW) {
        !           379:        BoxRec    cursorBox;
        !           380: 
        !           381:        if (apCursorLoc(pSrc->pScreen, &cursorBox)) {
        !           382:            register WindowPtr  pWin = (WindowPtr)pSrc;
        !           383: 
        !           384:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           385:                            x,y,w,h)) {
        !           386:                                apRemoveCursor(TRUE);
        !           387:            }
        !           388:        }
        !           389:     }
        !           390: 
        !           391:        (* apProcs.GetImage) (pSrc, x, y, w, h, format, planeMask, pBits);
        !           392: }
        !           393: 
        !           394: /*-
        !           395:  *-----------------------------------------------------------------------
        !           396:  * apCopyArea --
        !           397:  *     Remove the cursor if it overlaps either the source or destination
        !           398:  *     drawables, then call the screen-specific CopyArea routine.
        !           399:  *
        !           400:  * Results:
        !           401:  *     None.
        !           402:  *
        !           403:  * Side Effects:
        !           404:  *
        !           405:  *-----------------------------------------------------------------------
        !           406:  */
        !           407: void
        !           408: apCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty)
        !           409:     DrawablePtr          pSrc;
        !           410:     DrawablePtr          pDst;
        !           411:     GCPtr        pGC;
        !           412:     int                  srcx;
        !           413:     int                  srcy;
        !           414:     int                  w;
        !           415:     int                  h;
        !           416:     int                  dstx;
        !           417:     int                  dsty;
        !           418: {
        !           419:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           420:     BoxRec       cursorBox;
        !           421:     register WindowPtr pWin;
        !           422:     int                  out = FALSE;
        !           423: 
        !           424:     if (pSrc->type == DRAWABLE_WINDOW &&
        !           425:        apCursorLoc(pSrc->pScreen, &cursorBox)) {
        !           426:            pWin = (WindowPtr)pSrc;
        !           427: 
        !           428:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           429:                            srcx, srcy, w, h)) {
        !           430:                                apRemoveCursor(TRUE);
        !           431:                                out = TRUE;
        !           432:            }
        !           433:     }
        !           434: 
        !           435:     if (!out && pDst->type == DRAWABLE_WINDOW &&
        !           436:        apCursorLoc(pDst->pScreen, &cursorBox)) {
        !           437:            pWin = (WindowPtr)pDst;
        !           438:            
        !           439:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           440:                            dstx, dsty, w, h)) {
        !           441:                                apRemoveCursor(TRUE);
        !           442:            }
        !           443:     }
        !           444: 
        !           445:     COMPARE_GCS(pGC,pShadowGC);
        !           446:     (* pShadowGC->CopyArea) (pSrc, pDst, pShadowGC, srcx, srcy,
        !           447:                             w, h, dstx, dsty);
        !           448: }
        !           449: 
        !           450: /*-
        !           451:  *-----------------------------------------------------------------------
        !           452:  * apCopyPlane --
        !           453:  *     Remove the cursor as necessary and call the screen-specific
        !           454:  *     CopyPlane function.
        !           455:  *
        !           456:  * Results:
        !           457:  *     None.
        !           458:  *
        !           459:  * Side Effects:
        !           460:  *
        !           461:  *-----------------------------------------------------------------------
        !           462:  */
        !           463: void
        !           464: apCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, plane)
        !           465:     DrawablePtr          pSrc;
        !           466:     DrawablePtr          pDst;
        !           467:     register GC   *pGC;
        !           468:     int          srcx,
        !           469:                  srcy;
        !           470:     int          w,
        !           471:                  h;
        !           472:     int          dstx,
        !           473:                  dsty;
        !           474:     unsigned int  plane;
        !           475: {
        !           476:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           477:     BoxRec       cursorBox;
        !           478:     register WindowPtr pWin;
        !           479:     int                  out = FALSE;
        !           480: 
        !           481:     if (pSrc->type == DRAWABLE_WINDOW &&
        !           482:        apCursorLoc(pSrc->pScreen, &cursorBox)) {
        !           483:            pWin = (WindowPtr)pSrc;
        !           484: 
        !           485:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           486:                            srcx, srcy, w, h)) {
        !           487:                                apRemoveCursor(TRUE);
        !           488:                                out = TRUE;
        !           489:            }
        !           490:     }
        !           491: 
        !           492:     if (!out && pDst->type == DRAWABLE_WINDOW &&
        !           493:        apCursorLoc(pDst->pScreen, &cursorBox)) {
        !           494:            pWin = (WindowPtr)pDst;
        !           495:            
        !           496:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           497:                            dstx, dsty, w, h)) {
        !           498:                                apRemoveCursor(TRUE);
        !           499:            }
        !           500:     }
        !           501: 
        !           502:     COMPARE_GCS(pGC,pShadowGC);
        !           503:     (* pShadowGC->CopyPlane) (pSrc, pDst, pShadowGC, srcx, srcy, w, h,
        !           504:                              dstx, dsty, plane);
        !           505: }
        !           506: 
        !           507: /*-
        !           508:  *-----------------------------------------------------------------------
        !           509:  * apPolyPoint --
        !           510:  *     See if any of the points lies within the area covered by the
        !           511:  *     cursor and remove the cursor if one does. Then put the points
        !           512:  *     down.
        !           513:  *
        !           514:  * Results:
        !           515:  *     None.
        !           516:  *
        !           517:  * Side Effects:
        !           518:  *
        !           519:  *-----------------------------------------------------------------------
        !           520:  */
        !           521: void
        !           522: apPolyPoint (pDrawable, pGC, mode, npt, pptInit)
        !           523:     DrawablePtr pDrawable;
        !           524:     GCPtr      pGC;
        !           525:     int                mode;           /* Origin or Previous */
        !           526:     int                npt;
        !           527:     xPoint     *pptInit;
        !           528: {
        !           529:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           530:     register xPoint    *pts;
        !           531:     register int       nPts;
        !           532:     register int       xorg;
        !           533:     register int       yorg;
        !           534:     BoxRec             cursorBox;
        !           535: 
        !           536:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !           537:        apCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           538:            xorg = ((WindowPtr)pDrawable)->absCorner.x;
        !           539:            yorg = ((WindowPtr)pDrawable)->absCorner.y;
        !           540: 
        !           541:            if (mode == CoordModeOrigin) {
        !           542:                for (pts = pptInit, nPts = npt; nPts--; pts++) {
        !           543:                    if (ORG_OVERLAP(&cursorBox,xorg,yorg,pts->x,pts->y,0,0)){
        !           544:                        apRemoveCursor(TRUE);
        !           545:                        break;
        !           546:                    }
        !           547:                }
        !           548:            } else {
        !           549:                for (pts = pptInit, nPts = npt; nPts--; pts++) {
        !           550:                    if (ORG_OVERLAP(&cursorBox,xorg,yorg,pts->x,pts->y,0,0)){
        !           551:                        apRemoveCursor(TRUE);
        !           552:                        break;
        !           553:                    } else {
        !           554:                        xorg += pts->x;
        !           555:                        yorg += pts->y;
        !           556:                    }
        !           557:                }
        !           558:            }
        !           559:     }
        !           560: 
        !           561:     COMPARE_GCS(pGC,pShadowGC);
        !           562:     (* pShadowGC->PolyPoint) (pDrawable, pShadowGC, mode, npt, pptInit);
        !           563: }
        !           564: 
        !           565: /*-
        !           566:  *-----------------------------------------------------------------------
        !           567:  * apPolylines --
        !           568:  *     Find the bounding box of the lines and remove the cursor if
        !           569:  *     the box overlaps the area covered by the cursor. Then call
        !           570:  *     the screen's Polylines function to draw the lines themselves.
        !           571:  *
        !           572:  * Results:
        !           573:  *
        !           574:  * Side Effects:
        !           575:  *
        !           576:  *-----------------------------------------------------------------------
        !           577:  */
        !           578: void
        !           579: apPolylines (pDrawable, pGC, mode, npt, pptInit)
        !           580:     DrawablePtr          pDrawable;
        !           581:     GCPtr        pGC;
        !           582:     int                  mode;
        !           583:     int                  npt;
        !           584:     DDXPointPtr          pptInit;
        !           585: {
        !           586:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           587:     BoxRec       cursorBox;
        !           588: 
        !           589:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !           590:        apCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           591:            apSaveCursorBox(((WindowPtr)pDrawable)->absCorner.x,
        !           592:                             ((WindowPtr)pDrawable)->absCorner.y,
        !           593:                             mode,
        !           594:                             pptInit,
        !           595:                             npt,
        !           596:                             &cursorBox);
        !           597:     }
        !           598:     COMPARE_GCS(pGC,pShadowGC);
        !           599:     (*pShadowGC->Polylines) (pDrawable, pShadowGC, mode, npt, pptInit);
        !           600: }
        !           601: 
        !           602: /*-
        !           603:  *-----------------------------------------------------------------------
        !           604:  * apPolySegment --
        !           605:  *     Treat each segment as a box and remove the cursor if any box
        !           606:  *     overlaps the cursor's area. Then draw the segments. Note that
        !           607:  *     the endpoints of the segments are in no way guaranteed to be
        !           608:  *     in the right order, so we find the bounding box of the segment
        !           609:  *     in two comparisons and use that to figure things out.
        !           610:  *
        !           611:  * Results:
        !           612:  *     None.
        !           613:  *
        !           614:  * Side Effects:
        !           615:  *
        !           616:  *-----------------------------------------------------------------------
        !           617:  */
        !           618: void
        !           619: apPolySegment(pDraw, pGC, nseg, pSegs)
        !           620:     DrawablePtr pDraw;
        !           621:     GCPtr      pGC;
        !           622:     int                nseg;
        !           623:     xSegment   *pSegs;
        !           624: {
        !           625:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           626:     register xSegment  *pSeg;
        !           627:     register int       nSeg;
        !           628:     register int       xorg,
        !           629:                        yorg;
        !           630:     BoxRec             cursorBox;
        !           631:     Bool               nuke = FALSE;
        !           632: 
        !           633:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           634:        apCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           635:            xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           636:            yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           637: 
        !           638:            for (nSeg = nseg, pSeg = pSegs; nSeg--; pSeg++) {
        !           639:                if (pSeg->x1 < pSeg->x2) {
        !           640:                    if (pSeg->y1 < pSeg->y2) {
        !           641:                        nuke = BOX_OVERLAP(&cursorBox,
        !           642:                                           pSeg->x1+xorg,pSeg->y1+yorg,
        !           643:                                           pSeg->x2+xorg,pSeg->y2+yorg);
        !           644:                    } else {
        !           645:                        nuke = BOX_OVERLAP(&cursorBox,
        !           646:                                           pSeg->x1+xorg,pSeg->y2+yorg,
        !           647:                                           pSeg->x2+xorg,pSeg->y1+yorg);
        !           648:                    }
        !           649:                } else if (pSeg->y1 < pSeg->y2) {
        !           650:                    nuke = BOX_OVERLAP(&cursorBox,
        !           651:                                       pSeg->x2+xorg,pSeg->y1+yorg,
        !           652:                                       pSeg->x1+xorg,pSeg->y2+yorg);
        !           653:                } else {
        !           654:                    nuke = BOX_OVERLAP(&cursorBox,
        !           655:                                       pSeg->x2+xorg,pSeg->y2+yorg,
        !           656:                                       pSeg->x1+xorg,pSeg->y1+yorg);
        !           657:                }
        !           658:                if (nuke) {
        !           659:                    apRemoveCursor(TRUE);
        !           660:                    break;
        !           661:                }
        !           662:            }
        !           663:     }
        !           664: 
        !           665:     COMPARE_GCS(pGC,pShadowGC);
        !           666:     (* pShadowGC->PolySegment) (pDraw, pShadowGC, nseg, pSegs);
        !           667: }
        !           668: 
        !           669: /*-
        !           670:  *-----------------------------------------------------------------------
        !           671:  * apPolyRectangle --
        !           672:  *     Remove the cursor if it overlaps any of the rectangles to be
        !           673:  *     drawn, then draw them.
        !           674:  *
        !           675:  * Results:
        !           676:  *     None
        !           677:  *
        !           678:  * Side Effects:
        !           679:  *
        !           680:  *-----------------------------------------------------------------------
        !           681:  */
        !           682: void
        !           683: apPolyRectangle(pDraw, pGC, nrects, pRects)
        !           684:     DrawablePtr        pDraw;
        !           685:     GCPtr      pGC;
        !           686:     int                nrects;
        !           687:     xRectangle *pRects;
        !           688: {
        !           689:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           690:     register xRectangle        *pRect;
        !           691:     register int       nRect;
        !           692:     register int       xorg,
        !           693:                        yorg;
        !           694:     BoxRec             cursorBox;
        !           695: 
        !           696:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           697:        apCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           698:            xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           699:            yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           700: 
        !           701:            for (nRect = nrects, pRect = pRects; nRect--; pRect++) {
        !           702:                if (ORGRECT_OVERLAP(&cursorBox,xorg,yorg,pRect)){
        !           703:                    apRemoveCursor(TRUE);
        !           704:                    break;
        !           705:                }
        !           706:            }
        !           707:     }
        !           708: 
        !           709:     COMPARE_GCS(pGC,pShadowGC);
        !           710:     (* pShadowGC->PolyRectangle) (pDraw, pShadowGC, nrects, pRects);
        !           711: }
        !           712: 
        !           713: /*-
        !           714:  *-----------------------------------------------------------------------
        !           715:  * apPolyArc --
        !           716:  *     Using the bounding rectangle of each arc, remove the cursor
        !           717:  *     if it overlaps any arc, then draw all the arcs.
        !           718:  *
        !           719:  * Results:
        !           720:  *
        !           721:  * Side Effects:
        !           722:  *
        !           723:  *-----------------------------------------------------------------------
        !           724:  */
        !           725: void
        !           726: apPolyArc(pDraw, pGC, narcs, parcs)
        !           727:     DrawablePtr        pDraw;
        !           728:     GCPtr      pGC;
        !           729:     int                narcs;
        !           730:     xArc       *parcs;
        !           731: {
        !           732:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           733:     register xArc      *pArc;
        !           734:     register int       nArc;
        !           735:     register int       xorg,
        !           736:                        yorg;
        !           737:     BoxRec             cursorBox;
        !           738: 
        !           739:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           740:        apCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           741:            xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           742:            yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           743: 
        !           744:            for (nArc = narcs, pArc = parcs; nArc--; pArc++) {
        !           745:                if (ORGRECT_OVERLAP(&cursorBox,xorg,yorg,pArc)){
        !           746:                    apRemoveCursor(TRUE);
        !           747:                    break;
        !           748:                }
        !           749:            }
        !           750:     }
        !           751: 
        !           752:     COMPARE_GCS(pGC,pShadowGC);
        !           753:     (* pShadowGC->PolyArc) (pDraw, pShadowGC, narcs, parcs);
        !           754: }
        !           755: 
        !           756: /*-
        !           757:  *-----------------------------------------------------------------------
        !           758:  * apFillPolygon --
        !           759:  *     Find the bounding box of the polygon to fill and remove the
        !           760:  *     cursor if it overlaps this box...
        !           761:  *
        !           762:  * Results:
        !           763:  *     None.
        !           764:  *
        !           765:  * Side Effects:
        !           766:  *
        !           767:  *-----------------------------------------------------------------------
        !           768:  */
        !           769: void
        !           770: apFillPolygon(pDraw, pGC, shape, mode, count, pPts)
        !           771:     DrawablePtr                pDraw;
        !           772:     register GCPtr     pGC;
        !           773:     int                        shape, mode;
        !           774:     register int       count;
        !           775:     DDXPointPtr                pPts;
        !           776: {
        !           777:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           778:     BoxRec             cursorBox;
        !           779: 
        !           780:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           781:        apCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           782:            apSaveCursorBox(((WindowPtr)pDraw)->absCorner.x,
        !           783:                             ((WindowPtr)pDraw)->absCorner.y,
        !           784:                             mode,
        !           785:                             pPts,
        !           786:                             count,
        !           787:                             &cursorBox);
        !           788:     }
        !           789: 
        !           790:     COMPARE_GCS(pGC,pShadowGC);
        !           791:     (* pShadowGC->FillPolygon) (pDraw, pShadowGC, shape, mode, count, pPts);
        !           792: }
        !           793: 
        !           794: /*-
        !           795:  *-----------------------------------------------------------------------
        !           796:  * apPolyFillRect --
        !           797:  *     Remove the cursor if it overlaps any of the filled rectangles
        !           798:  *     to be drawn by the output routines.
        !           799:  *
        !           800:  * Results:
        !           801:  *     None.
        !           802:  *
        !           803:  * Side Effects:
        !           804:  *
        !           805:  *-----------------------------------------------------------------------
        !           806:  */
        !           807: void
        !           808: apPolyFillRect(pDrawable, pGC, nrectFill, prectInit)
        !           809:     DrawablePtr pDrawable;
        !           810:     GCPtr      pGC;
        !           811:     int                nrectFill;      /* number of rectangles to fill */
        !           812:     xRectangle *prectInit;     /* Pointer to first rectangle to fill */
        !           813: {
        !           814:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           815:     register xRectangle        *pRect;
        !           816:     register int       nRect;
        !           817:     register int       xorg,
        !           818:                        yorg;
        !           819:     BoxRec             cursorBox;
        !           820: 
        !           821:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !           822:        apCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           823:            xorg = ((WindowPtr)pDrawable)->absCorner.x;
        !           824:            yorg = ((WindowPtr)pDrawable)->absCorner.y;
        !           825: 
        !           826:            for (nRect = nrectFill, pRect = prectInit; nRect--; pRect++) {
        !           827:                if (ORGRECT_OVERLAP(&cursorBox,xorg,yorg,pRect)){
        !           828:                    apRemoveCursor(TRUE);
        !           829:                    break;
        !           830:                }
        !           831:            }
        !           832:     }
        !           833: 
        !           834:     COMPARE_GCS(pGC,pShadowGC);
        !           835:     (* pShadowGC->PolyFillRect) (pDrawable, pShadowGC, nrectFill, prectInit);
        !           836: }
        !           837: 
        !           838: /*-
        !           839:  *-----------------------------------------------------------------------
        !           840:  * apPolyFillArc --
        !           841:  *     See if the cursor overlaps any of the bounding boxes for the
        !           842:  *     filled arc and remove it if it does.
        !           843:  *
        !           844:  * Results:
        !           845:  *     None.
        !           846:  *
        !           847:  * Side Effects:
        !           848:  *
        !           849:  *-----------------------------------------------------------------------
        !           850:  */
        !           851: void
        !           852: apPolyFillArc(pDraw, pGC, narcs, parcs)
        !           853:     DrawablePtr        pDraw;
        !           854:     GCPtr      pGC;
        !           855:     int                narcs;
        !           856:     xArc       *parcs;
        !           857: {
        !           858:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           859:     register xArc      *pArc;
        !           860:     register int       nArc;
        !           861:     register int       xorg,
        !           862:                        yorg;
        !           863:     BoxRec             cursorBox;
        !           864: 
        !           865:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           866:        apCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           867:            xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           868:            yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           869: 
        !           870:            for (nArc = narcs, pArc = parcs; nArc--; pArc++) {
        !           871:                if (ORGRECT_OVERLAP(&cursorBox,xorg,yorg,pArc)){
        !           872:                    apRemoveCursor(TRUE);
        !           873:                    break;
        !           874:                }
        !           875:            }
        !           876:     }
        !           877: 
        !           878:     COMPARE_GCS(pGC,pShadowGC);
        !           879:     (* pShadowGC->PolyFillArc) (pDraw, pShadowGC, narcs, parcs);
        !           880: }
        !           881: 
        !           882: /*-
        !           883:  *-----------------------------------------------------------------------
        !           884:  * apText --
        !           885:  *     Find the extent of a text operation and remove the cursor if they
        !           886:  *     overlap. pDraw is assumed to be a window.
        !           887:  *
        !           888:  * Results:
        !           889:  *
        !           890:  * Side Effects:
        !           891:  *
        !           892:  *-----------------------------------------------------------------------
        !           893:  */
        !           894: int
        !           895: apText(pDraw, pGC, x, y, count, chars, fontEncoding, drawFunc)
        !           896:     DrawablePtr   pDraw;
        !           897:     GCPtr        pGC;
        !           898:     int                  x,
        !           899:                  y;
        !           900:     int                  count;
        !           901:     char         *chars;
        !           902:     FontEncoding  fontEncoding;
        !           903:     void         (*drawFunc)();
        !           904: {
        !           905:     CharInfoPtr   *charinfo;
        !           906:     unsigned int  n,
        !           907:                  w;
        !           908:     register int  xorg,
        !           909:                  yorg;
        !           910:     ExtentInfoRec extents;
        !           911:     BoxRec       cursorBox;
        !           912: 
        !           913:     charinfo = (CharInfoPtr *)ALLOCATE_LOCAL (count * sizeof(CharInfoPtr));
        !           914:     if (charinfo == (CharInfoPtr *)NULL) {
        !           915:        return x;
        !           916:     }
        !           917: 
        !           918:     GetGlyphs(pGC->font, count, chars, fontEncoding, &n, charinfo);
        !           919: 
        !           920:     if (apCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           921:        QueryGlyphExtents(pGC->font, charinfo, count, &extents);
        !           922:        w = extents.overallWidth;
        !           923:        xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           924:        yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           925:     
        !           926:        if (BOX_OVERLAP(&cursorBox,
        !           927:                        x + xorg + extents.overallLeft,
        !           928:                        y + yorg - extents.overallAscent,
        !           929:                        x + xorg + extents.overallRight,
        !           930:                        y + yorg + extents.overallDescent)) {
        !           931:                            apRemoveCursor(TRUE);
        !           932:        }
        !           933:     } else {
        !           934:        w = 0;
        !           935:     }
        !           936:     
        !           937:     if (n != 0) {
        !           938:         (* drawFunc)(pDraw, pGC, x, y, n, charinfo, pGC->font->pGlyphs);
        !           939:     }
        !           940: 
        !           941:     DEALLOCATE_LOCAL(charinfo);
        !           942:     return x+w;
        !           943: }
        !           944: 
        !           945: /*-
        !           946:  *-----------------------------------------------------------------------
        !           947:  * apPolyText8 --
        !           948:  *
        !           949:  * Results:
        !           950:  *
        !           951:  * Side Effects:
        !           952:  *
        !           953:  *-----------------------------------------------------------------------
        !           954:  */
        !           955: int
        !           956: apPolyText8(pDraw, pGC, x, y, count, chars)
        !           957:     DrawablePtr pDraw;
        !           958:     GCPtr      pGC;
        !           959:     int                x, y;
        !           960:     int        count;
        !           961:     char       *chars;
        !           962: {
        !           963:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           964: 
        !           965:     COMPARE_GCS(pGC,pShadowGC);
        !           966:     if (pDraw->type == DRAWABLE_WINDOW) {
        !           967:        return apText (pDraw, pShadowGC, x, y, count, chars, Linear8Bit,
        !           968:                        pShadowGC->PolyGlyphBlt);
        !           969:     } else {
        !           970:        return (* pShadowGC->PolyText8)(pDraw, pShadowGC, x, y, count, chars);
        !           971:     }
        !           972: }
        !           973: 
        !           974: /*-
        !           975:  *-----------------------------------------------------------------------
        !           976:  * apPolyText16 --
        !           977:  *
        !           978:  * Results:
        !           979:  *
        !           980:  * Side Effects:
        !           981:  *
        !           982:  *-----------------------------------------------------------------------
        !           983:  */
        !           984: int
        !           985: apPolyText16(pDraw, pGC, x, y, count, chars)
        !           986:     DrawablePtr pDraw;
        !           987:     GCPtr      pGC;
        !           988:     int                x, y;
        !           989:     int                count;
        !           990:     unsigned short *chars;
        !           991: {
        !           992:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           993: 
        !           994:     COMPARE_GCS(pGC,pShadowGC);
        !           995:     if (pDraw->type == DRAWABLE_WINDOW) {
        !           996:        return apText (pDraw, pShadowGC, x, y, count, chars,
        !           997:                        (pShadowGC->font->pFI->lastRow == 0 ?
        !           998:                         Linear16Bit : TwoD16Bit),
        !           999:                        pShadowGC->PolyGlyphBlt);
        !          1000:     } else {
        !          1001:        return (* pShadowGC->PolyText16) (pDraw, pShadowGC, x, y,
        !          1002:                                          count, chars);
        !          1003:     }
        !          1004: }
        !          1005: 
        !          1006: /*-
        !          1007:  *-----------------------------------------------------------------------
        !          1008:  * apImageText8 --
        !          1009:  *
        !          1010:  * Results:
        !          1011:  *
        !          1012:  * Side Effects:
        !          1013:  *
        !          1014:  *-----------------------------------------------------------------------
        !          1015:  */
        !          1016: void
        !          1017: apImageText8(pDraw, pGC, x, y, count, chars)
        !          1018:     DrawablePtr pDraw;
        !          1019:     GCPtr      pGC;
        !          1020:     int                x, y;
        !          1021:     int                count;
        !          1022:     char       *chars;
        !          1023: {
        !          1024:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1025: 
        !          1026:     COMPARE_GCS(pGC,pShadowGC);
        !          1027:     if (pDraw->type == DRAWABLE_WINDOW) {
        !          1028:        (void) apText (pDraw, pShadowGC, x, y, count, chars,
        !          1029:                        Linear8Bit, pShadowGC->ImageGlyphBlt);
        !          1030:     } else {
        !          1031:        (* pShadowGC->ImageText8) (pDraw, pShadowGC, x, y, count, chars);
        !          1032:     }
        !          1033: }
        !          1034: 
        !          1035: /*-
        !          1036:  *-----------------------------------------------------------------------
        !          1037:  * apImageText16 --
        !          1038:  *
        !          1039:  * Results:
        !          1040:  *
        !          1041:  * Side Effects:
        !          1042:  *
        !          1043:  *-----------------------------------------------------------------------
        !          1044:  */
        !          1045: void
        !          1046: apImageText16(pDraw, pGC, x, y, count, chars)
        !          1047:     DrawablePtr pDraw;
        !          1048:     GCPtr      pGC;
        !          1049:     int                x, y;
        !          1050:     int                count;
        !          1051:     unsigned short *chars;
        !          1052: {
        !          1053:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1054: 
        !          1055:     COMPARE_GCS(pGC,pShadowGC);
        !          1056:     if (pDraw->type == DRAWABLE_WINDOW) {
        !          1057:        (void) apText (pDraw, pShadowGC, x, y, count, chars,
        !          1058:                        (pShadowGC->font->pFI->lastRow == 0 ?
        !          1059:                         Linear16Bit : TwoD16Bit),
        !          1060:                        pShadowGC->ImageGlyphBlt);
        !          1061:     } else {
        !          1062:        (* pShadowGC->ImageText16) (pDraw, pShadowGC, x, y, count, chars);
        !          1063:     }
        !          1064: }
        !          1065: 
        !          1066: /*-
        !          1067:  *-----------------------------------------------------------------------
        !          1068:  * apImageGlyphBlt --
        !          1069:  *
        !          1070:  * Results:
        !          1071:  *
        !          1072:  * Side Effects:
        !          1073:  *
        !          1074:  *-----------------------------------------------------------------------
        !          1075:  */
        !          1076: void
        !          1077: apImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
        !          1078:     DrawablePtr pDrawable;
        !          1079:     GC                 *pGC;
        !          1080:     int        x, y;
        !          1081:     unsigned int nglyph;
        !          1082:     CharInfoPtr *ppci;         /* array of character info */
        !          1083:     pointer    pglyphBase;     /* start of array of glyphs */
        !          1084: {
        !          1085:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1086:     BoxRec             cursorBox;
        !          1087:     ExtentInfoRec      extents;
        !          1088:     register int       xorg,
        !          1089:                        yorg;
        !          1090: 
        !          1091:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !          1092:        apCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !          1093:            QueryGlyphExtents (pGC->font, ppci, nglyph, &extents);
        !          1094:            xorg = ((WindowPtr)pDrawable)->absCorner.x + x;
        !          1095:            yorg = ((WindowPtr)pDrawable)->absCorner.y + y;
        !          1096:            if (BOX_OVERLAP(&cursorBox,xorg+extents.overallLeft,
        !          1097:                            yorg+extents.overallAscent,
        !          1098:                            xorg+extents.overallRight,
        !          1099:                            yorg+extents.overallDescent)) {
        !          1100:                                apRemoveCursor(TRUE);
        !          1101:            }
        !          1102:     }
        !          1103: 
        !          1104:     COMPARE_GCS(pGC,pShadowGC);
        !          1105:     (* pShadowGC->ImageGlyphBlt) (pDrawable, pShadowGC, x, y, nglyph,
        !          1106:                                  ppci, pglyphBase);
        !          1107: }
        !          1108: 
        !          1109: /*-
        !          1110:  *-----------------------------------------------------------------------
        !          1111:  * apPolyGlyphBlt --
        !          1112:  *
        !          1113:  * Results:
        !          1114:  *
        !          1115:  * Side Effects:
        !          1116:  *
        !          1117:  *-----------------------------------------------------------------------
        !          1118:  */
        !          1119: void
        !          1120: apPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
        !          1121:     DrawablePtr pDrawable;
        !          1122:     GCPtr      pGC;
        !          1123:     int        x, y;
        !          1124:     unsigned int nglyph;
        !          1125:     CharInfoPtr *ppci;         /* array of character info */
        !          1126:     char       *pglyphBase;    /* start of array of glyphs */
        !          1127: {
        !          1128:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1129:     BoxRec             cursorBox;
        !          1130:     ExtentInfoRec      extents;
        !          1131:     register int       xorg,
        !          1132:                        yorg;
        !          1133: 
        !          1134:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !          1135:        apCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !          1136:            QueryGlyphExtents (pGC->font, ppci, nglyph, &extents);
        !          1137:            xorg = ((WindowPtr)pDrawable)->absCorner.x + x;
        !          1138:            yorg = ((WindowPtr)pDrawable)->absCorner.y + y;
        !          1139:            if (BOX_OVERLAP(&cursorBox,xorg+extents.overallLeft,
        !          1140:                            yorg+extents.overallAscent,
        !          1141:                            xorg+extents.overallRight,
        !          1142:                            yorg+extents.overallDescent)){
        !          1143:                                apRemoveCursor(TRUE);
        !          1144:            }
        !          1145:     }
        !          1146: 
        !          1147:     COMPARE_GCS(pGC,pShadowGC);
        !          1148:     (* pShadowGC->PolyGlyphBlt) (pDrawable, pShadowGC, x, y,
        !          1149:                                nglyph, ppci, pglyphBase);
        !          1150: }
        !          1151: 
        !          1152: /*-
        !          1153:  *-----------------------------------------------------------------------
        !          1154:  * apPushPixels --
        !          1155:  *
        !          1156:  * Results:
        !          1157:  *
        !          1158:  * Side Effects:
        !          1159:  *
        !          1160:  *-----------------------------------------------------------------------
        !          1161:  */
        !          1162: void
        !          1163: apPushPixels(pGC, pBitMap, pDst, w, h, x, y)
        !          1164:     GCPtr      pGC;
        !          1165:     PixmapPtr  pBitMap;
        !          1166:     DrawablePtr pDst;
        !          1167:     int                w, h, x, y;
        !          1168: {
        !          1169: 
        !          1170:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1171:     BoxRec             cursorBox;
        !          1172:     register int       xorg,
        !          1173:                        yorg;
        !          1174: 
        !          1175:     if (pDst->type == DRAWABLE_WINDOW &&
        !          1176:        apCursorLoc (pDst->pScreen, &cursorBox)) {
        !          1177:            xorg = ((WindowPtr)pDst)->absCorner.x + x;
        !          1178:            yorg = ((WindowPtr)pDst)->absCorner.y + y;
        !          1179: 
        !          1180:            if (BOX_OVERLAP(&cursorBox,xorg,yorg,xorg+w,yorg+h)){
        !          1181:                apRemoveCursor(TRUE);
        !          1182:            }
        !          1183:     }
        !          1184: 
        !          1185:     COMPARE_GCS(pGC,pShadowGC);
        !          1186:     (* pShadowGC->PushPixels) (pShadowGC, pBitMap, pDst, w, h, x, y);
        !          1187: }
        !          1188: 
        !          1189: /*-
        !          1190:  *-----------------------------------------------------------------------
        !          1191:  * apLineHelper --
        !          1192:  *
        !          1193:  * Results:
        !          1194:  *
        !          1195:  * Side Effects:
        !          1196:  *
        !          1197:  *-----------------------------------------------------------------------
        !          1198:  */
        !          1199: void
        !          1200: apLineHelper (pDraw, pGC, caps, npt, pPts, xOrg, yOrg)
        !          1201:     DrawablePtr pDraw;
        !          1202:     GCPtr      pGC;
        !          1203:     int                caps;
        !          1204:     int                npt;
        !          1205:     SppPointPtr pPts;
        !          1206:     int                xOrg, yOrg;
        !          1207: {
        !          1208:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !          1209: 
        !          1210:     COMPARE_GCS(pGC,pShadowGC);
        !          1211:     (* pShadowGC->LineHelper) (pDraw, pShadowGC, caps, npt, pPts, xOrg, yOrg);
        !          1212: }
        !          1213: 
        !          1214: /*-
        !          1215:  *-----------------------------------------------------------------------
        !          1216:  * apChangeClip --
        !          1217:  *     Front end for changing the clip in the GC. Just passes the command
        !          1218:  *     on through the shadow GC.
        !          1219:  *
        !          1220:  *
        !          1221:  * Results:
        !          1222:  *     None.
        !          1223:  *
        !          1224:  * Side Effects:
        !          1225:  *     ???
        !          1226:  *
        !          1227:  *-----------------------------------------------------------------------
        !          1228:  */
        !          1229: void
        !          1230: apChangeClip (pGC, type, pValue, numRects)
        !          1231:     GCPtr        pGC;
        !          1232:     int                  type;
        !          1233:     pointer      pValue;
        !          1234:     int                  numRects;
        !          1235: {
        !          1236:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !          1237: 
        !          1238:     COMPARE_GCS(pGC,pShadowGC);
        !          1239:     (* pShadowGC->ChangeClip) (pShadowGC, type, pValue, numRects);
        !          1240: }
        !          1241: 
        !          1242: /*-
        !          1243:  *-----------------------------------------------------------------------
        !          1244:  * apDestroyClip --
        !          1245:  *     Ditto for destroying the clipping region of the GC.
        !          1246:  *
        !          1247:  * Results:
        !          1248:  *     None.
        !          1249:  *
        !          1250:  * Side Effects:
        !          1251:  *     ???
        !          1252:  *
        !          1253:  *-----------------------------------------------------------------------
        !          1254:  */
        !          1255: void
        !          1256: apDestroyClip (pGC)
        !          1257:     GCPtr   pGC;
        !          1258: {
        !          1259:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !          1260: 
        !          1261:     COMPARE_GCS(pGC,pShadowGC);
        !          1262:     (* pShadowGC->DestroyClip) (pShadowGC);
        !          1263: }
        !          1264: 
        !          1265: /*-
        !          1266:  *-----------------------------------------------------------------------
        !          1267:  * apDestroyGC --
        !          1268:  *     Function called when a GC is being freed. Simply unlinks and frees
        !          1269:  *     the GCInterest structure.
        !          1270:  *
        !          1271:  * Results:
        !          1272:  *     None.
        !          1273:  *
        !          1274:  * Side Effects:
        !          1275:  *     The GCInterest structure is removed from the chain but its own
        !          1276:  *     links are untouched (so FreeGC has something to follow...)
        !          1277:  *
        !          1278:  *-----------------------------------------------------------------------
        !          1279:  */
        !          1280: void
        !          1281: apDestroyGC (pGC, pGCI)
        !          1282:     GCPtr         pGC; /* GC pGCI is attached to */
        !          1283:     GCInterestPtr  pGCI;       /* GCInterest being destroyed */
        !          1284: {
        !          1285:     if (pGC->devPriv)
        !          1286:        FreeGC ((GCPtr)pGC->devPriv);
        !          1287:     Xfree (pGCI);
        !          1288: }
        !          1289: 
        !          1290: /*-
        !          1291:  *-----------------------------------------------------------------------
        !          1292:  * apValidateGC --
        !          1293:  *     Called when a GC is about to be used for drawing. Copies all
        !          1294:  *     changes from the GC to its shadow and validates the shadow.
        !          1295:  *
        !          1296:  * Results:
        !          1297:  *     TRUE, for no readily apparent reason.
        !          1298:  *
        !          1299:  * Side Effects:
        !          1300:  *     Vectors in the shadow GC will likely be changed.
        !          1301:  *
        !          1302:  *-----------------------------------------------------------------------
        !          1303:  */
        !          1304: /*ARGSUSED*/
        !          1305: static void
        !          1306: apValidateGC (pGC, pGCI, changes, pDrawable)
        !          1307:     GCPtr        pGC;
        !          1308:     GCInterestPtr pGCI;
        !          1309:     Mask         changes;
        !          1310:     DrawablePtr          pDrawable;
        !          1311: {
        !          1312:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !          1313: 
        !          1314:     if ( pGC->depth != pDrawable->depth )
        !          1315:        FatalError( "apValidateGC: depth mismatch.\n" );
        !          1316: 
        !          1317:     CopyGC (pGC, pShadowGC, changes);
        !          1318:     pShadowGC->serialNumber = pGC->serialNumber;
        !          1319:     COMPARE_GCS(pGC,pShadowGC);
        !          1320:     ValidateGC (pDrawable, pShadowGC);
        !          1321: }
        !          1322:        
        !          1323: /*-
        !          1324:  *-----------------------------------------------------------------------
        !          1325:  * apCopyGC --
        !          1326:  *     Called when a GC with its shadow is the destination of a copy.
        !          1327:  *     Calls CopyGC to transfer the changes to the shadow GC as well.
        !          1328:  *     Should not be used for the CopyGCSource since we like to copy from
        !          1329:  *     the real GC to the shadow using CopyGC...
        !          1330:  *
        !          1331:  * Results:
        !          1332:  *     None.
        !          1333:  *
        !          1334:  * Side Effects:
        !          1335:  *     Any changes in the real GC are copied to the shadow.
        !          1336:  *
        !          1337:  *-----------------------------------------------------------------------
        !          1338:  */
        !          1339: /*ARGSUSED*/
        !          1340: void
        !          1341: apCopyGC (pGCDst, pGCI, changes, pGCSrc)
        !          1342:     GCPtr        pGCDst;
        !          1343:     GCInterestPtr pGCI;
        !          1344:     int          changes;
        !          1345:     GCPtr        pGCSrc;
        !          1346: {
        !          1347:     CopyGC (pGCSrc, (GCPtr) pGCDst->devPriv, changes);
        !          1348:     COMPARE_GCS(pGCSrc,(GCPtr) pGCDst->devPriv);
        !          1349: }
        !          1350: 
        !          1351: /*
        !          1352:  * Array of functions to replace the functions in the GC.
        !          1353:  * Caveat: Depends on the ordering of functions in the GC structure.
        !          1354:  */
        !          1355: static void (* apGCFuncs[]) () = {
        !          1356:     apFillSpans,
        !          1357:     apSetSpans,
        !          1358: 
        !          1359:     apPutImage,
        !          1360:     apCopyArea,
        !          1361:     apCopyPlane,
        !          1362:     apPolyPoint,
        !          1363:     apPolylines,
        !          1364:     apPolySegment,
        !          1365:     apPolyRectangle,
        !          1366:     apPolyArc,
        !          1367:     apFillPolygon,
        !          1368:     apPolyFillRect,
        !          1369:     apPolyFillArc,
        !          1370:     (void(*)())apPolyText8,
        !          1371:     (void(*)())apPolyText16,
        !          1372:     apImageText8,
        !          1373:     apImageText16,
        !          1374:     apImageGlyphBlt,
        !          1375:     apPolyGlyphBlt,
        !          1376:     apPushPixels,
        !          1377:     apLineHelper,
        !          1378:     apChangeClip,
        !          1379:     apDestroyClip
        !          1380: };
        !          1381: 
        !          1382: /*-
        !          1383:  *-----------------------------------------------------------------------
        !          1384:  * apCreateGC --
        !          1385:  *     This function is used to get our own validation hooks into each
        !          1386:  *     GC to preserve the cursor. It calls the regular creation routine
        !          1387:  *     for the screen and then, if that was successful, tacks another
        !          1388:  *     GCInterest structure onto the GC *after* the one placed on by
        !          1389:  *     the screen-specific CreateGC...
        !          1390:  *
        !          1391:  * Results:
        !          1392:  *     TRUE if created ok. FALSE otherwise.
        !          1393:  *
        !          1394:  * Side Effects:
        !          1395:  *     A GCInterest structure is stuck on the end of the GC's list.
        !          1396:  *
        !          1397:  *-----------------------------------------------------------------------
        !          1398:  */
        !          1399: Bool
        !          1400: apCreateGC (pGC)
        !          1401:     GCPtr      pGC;    /* The GC to play with */
        !          1402: {
        !          1403:     GCInterestPtr      pGCI;
        !          1404:     register GCPtr     pShadowGC;
        !          1405:     int                i;
        !          1406:     
        !          1407:     if ((*apProcs.CreateGC) (pGC)) {
        !          1408: 
        !          1409:        if (pGC->depth != pGC->pScreen->rootDepth) {
        !          1410:            /* This GC will never be used for painting the screen,  so no shadow needed */
        !          1411:            return TRUE;
        !          1412:        }
        !          1413: 
        !          1414:        pShadowGC = (GCPtr) Xalloc (sizeof (GC));
        !          1415:        if (pShadowGC == (GCPtr)NULL) {
        !          1416:            return FALSE;
        !          1417:        }
        !          1418:        
        !          1419:        *pShadowGC = *pGC;
        !          1420:        pGC->devPriv = (pointer)pShadowGC;
        !          1421:        bcopy (apGCFuncs, &pGC->FillSpans, sizeof (apGCFuncs));
        !          1422:        
        !          1423:        pGCI = (GCInterestPtr) Xalloc (sizeof (GCInterestRec));
        !          1424:        if (!pGCI) {
        !          1425:            return FALSE;
        !          1426:        }
        !          1427: 
        !          1428:        /*
        !          1429:         * Any structure being shared between these two GCs must have its
        !          1430:         * reference count incremented. This includes:
        !          1431:         *  font, tile, stipple.
        !          1432:         * Anything which doesn't have a reference count must be duplicated:
        !          1433:         *  pCompositeClip, pAbsClientRegion.
        !          1434:         * 
        !          1435:         */
        !          1436:        if (pGC->font) {
        !          1437:            pGC->font->refcnt++;
        !          1438:        }
        !          1439:        if (pGC->tile) {
        !          1440:            pGC->tile->refcnt++;
        !          1441:        }
        !          1442:        if (pGC->stipple) {
        !          1443:            pGC->stipple->refcnt++;
        !          1444:        }
        !          1445:        pShadowGC->dash = (unsigned char *)
        !          1446:                Xalloc(2 * sizeof(unsigned char));
        !          1447:        for (i=0; i<pGC->numInDashList; i++)
        !          1448:                pShadowGC->dash[i] = pGC->dash[i];
        !          1449: 
        !          1450: #ifdef notdef
        !          1451:        if (pGC->pCompositeClip) {
        !          1452:            pShadowGC->pCompositeClip =
        !          1453:                (* pGC->pScreen->RegionCreate) (NULL, 1);
        !          1454:            (* pGC->pScreen->RegionCopy) (pShadowGC->pCompositeClip,
        !          1455:                                          pGC->pCompositeClip);
        !          1456:        }
        !          1457:        if (pGC->pAbsClientRegion) {
        !          1458:            pShadowGC->pAbsClientRegion=
        !          1459:                (* pGC->pScreen->RegionCreate) (NULL, 1);
        !          1460:            (* pGC->pScreen->RegionCopy) (pShadowGC->pAbsClientRegion,
        !          1461:                                          pGC->pAbsClientRegion);
        !          1462:        }
        !          1463: #endif notdef
        !          1464:        
        !          1465:        pGC->pNextGCInterest = pGCI;
        !          1466:        pGC->pLastGCInterest = pGCI;
        !          1467:        pGCI->pNextGCInterest = (GCInterestPtr) &pGC->pNextGCInterest;
        !          1468:        pGCI->pLastGCInterest = (GCInterestPtr) &pGC->pNextGCInterest;
        !          1469:        pGCI->length = sizeof(GCInterestRec);
        !          1470:        pGCI->owner = 0;                    /* server owns this */
        !          1471:        pGCI->ValInterestMask = ~0;         /* interested in everything */
        !          1472:        pGCI->ValidateGC = apValidateGC;
        !          1473:        pGCI->ChangeInterestMask = 0;       /* interested in nothing */
        !          1474:        pGCI->ChangeGC = (int (*)()) NULL;
        !          1475:        pGCI->CopyGCSource = (void (*)())NULL;
        !          1476:        pGCI->CopyGCDest = apCopyGC;
        !          1477:        pGCI->DestroyGC = apDestroyGC;
        !          1478:        
        !          1479: 
        !          1480:        /*
        !          1481:         * Because of this weird way of handling the GCInterest lists,
        !          1482:         * we need to modify the output library's GCInterest structure to
        !          1483:         * point to the pNextGCInterest field of the shadow GC...
        !          1484:         */
        !          1485:        pGCI = pShadowGC->pNextGCInterest;
        !          1486:        pGCI->pLastGCInterest = pGCI->pNextGCInterest =
        !          1487:            (GCInterestPtr) &pShadowGC->pNextGCInterest;
        !          1488: 
        !          1489:        return TRUE;
        !          1490:     } else {
        !          1491:        return FALSE;
        !          1492:     }
        !          1493: }
        !          1494: 
        !          1495: /*-
        !          1496:  * apPaintWindowBackground --
        !          1497:  *     Paint the window's background while preserving the cursor
        !          1498:  */
        !          1499: #define apPaintWindowBorder apPaintWindowBackground
        !          1500: void
        !          1501: apPaintWindowBackground (pWin, pRegion, what)
        !          1502:     WindowPtr  pWin;
        !          1503:     RegionPtr  pRegion;
        !          1504:     int                what;
        !          1505: {
        !          1506:     BoxRec     cursorBox;
        !          1507:     WinPrivPtr pPriv;
        !          1508:     ScreenPtr  pScreen;
        !          1509: 
        !          1510:     pScreen = pWin->drawable.pScreen;
        !          1511: 
        !          1512:     if (apCursorLoc (pScreen, &cursorBox)) {
        !          1513:        /*
        !          1514:         * If the cursor is on the same screen as the window, check the
        !          1515:         * region to paint for the cursor and remove it as necessary
        !          1516:         */
        !          1517:        if ((* pScreen->RectIn) (pRegion, &cursorBox) != rgnOUT) {
        !          1518:            apRemoveCursor(TRUE);
        !          1519:        }
        !          1520:     }
        !          1521: 
        !          1522:     pPriv = (WinPrivPtr) LookupID (pWin->wid, RT_WINDOW, wPrivClass);
        !          1523:     if (what == PW_BACKGROUND) {
        !          1524:        (* pPriv->PaintWindowBackground) (pWin, pRegion, what);
        !          1525:     } else {
        !          1526:        (* pPriv->PaintWindowBorder) (pWin, pRegion, what);
        !          1527:     }
        !          1528: }
        !          1529: 
        !          1530: /*-
        !          1531:  *-----------------------------------------------------------------------
        !          1532:  * apCopyWindow --
        !          1533:  *     Protect the cursor from window copies..
        !          1534:  *
        !          1535:  * Results:
        !          1536:  *     None.
        !          1537:  *
        !          1538:  * Side Effects:
        !          1539:  *     The cursor may be removed.
        !          1540:  *
        !          1541:  *-----------------------------------------------------------------------
        !          1542:  */
        !          1543: void
        !          1544: apCopyWindow (pWin, ptOldOrg, prgnSrc)
        !          1545:     WindowPtr    pWin;
        !          1546:     DDXPointRec          ptOldOrg;
        !          1547:     RegionPtr    prgnSrc;
        !          1548: {
        !          1549:     BoxRec     cursorBox;
        !          1550:     WinPrivPtr pPriv;
        !          1551:     ScreenPtr  pScreen;
        !          1552: 
        !          1553:     pScreen = pWin->drawable.pScreen;
        !          1554: 
        !          1555:     if (apCursorLoc (pScreen, &cursorBox)) {
        !          1556:        /*
        !          1557:         * If the cursor is on the same screen, compare the box for the
        !          1558:         * cursor against the original window clip region (prgnSrc) and
        !          1559:         * the current window clip region (pWin->borderClip) and if it
        !          1560:         * overlaps either one, remove the cursor. (Should it really be
        !          1561:         * borderClip?)
        !          1562:         */
        !          1563:        switch ((* pScreen->RectIn) (prgnSrc, &cursorBox)) {
        !          1564:            case rgnOUT:
        !          1565:                if ((* pScreen->RectIn) (pWin->borderClip, &cursorBox) ==
        !          1566:                    rgnOUT) {
        !          1567:                        break;
        !          1568:                }
        !          1569:            case rgnIN:
        !          1570:            case rgnPART:
        !          1571:                apRemoveCursor(TRUE);
        !          1572:        }
        !          1573:     }
        !          1574: 
        !          1575:     pPriv = (WinPrivPtr) LookupID (pWin->wid, RT_WINDOW, wPrivClass);
        !          1576:     (* pPriv->CopyWindow) (pWin, ptOldOrg, prgnSrc);
        !          1577: }
        !          1578: 
        !          1579: /*-
        !          1580:  * apCreateWindow --
        !          1581:  *     Allow the output library to do its thing and then make sure
        !          1582:  *     we intercept calls to PaintWindow{Border,Background} and
        !          1583:  *     ClearToBackground
        !          1584:  */
        !          1585: Bool
        !          1586: apCreateWindow(pWin)
        !          1587:     WindowPtr  pWin;
        !          1588: {
        !          1589:     WinPrivPtr pPriv;
        !          1590: 
        !          1591:     (*apProcs.CreateWindow) (pWin);
        !          1592: 
        !          1593:     pPriv = (WinPrivPtr) Xalloc (sizeof (WinPrivRec));
        !          1594:     pPriv->PaintWindowBackground = pWin->PaintWindowBackground;
        !          1595:     pPriv->PaintWindowBorder = pWin->PaintWindowBorder;
        !          1596:     pPriv->CopyWindow = pWin->CopyWindow;
        !          1597: 
        !          1598:     AddResource (pWin->wid, RT_WINDOW, (pointer)pPriv, Xfree, 
        !          1599:                 wPrivClass);
        !          1600: 
        !          1601:     pWin->PaintWindowBackground = apPaintWindowBackground;
        !          1602:     pWin->PaintWindowBorder = apPaintWindowBorder;
        !          1603:     pWin->CopyWindow = apCopyWindow;
        !          1604: 
        !          1605: }
        !          1606: 
        !          1607: /*-
        !          1608:  * apChangeWindowAttributes --
        !          1609:  *     Catch the changing of the background/border functions
        !          1610:  */
        !          1611: Bool
        !          1612: apChangeWindowAttributes(pWin, mask)
        !          1613:     WindowPtr  pWin;
        !          1614:     Mask       mask;
        !          1615: {
        !          1616:     WinPrivPtr pPriv;
        !          1617: 
        !          1618:     (*apProcs.ChangeWindowAttributes) (pWin, mask);
        !          1619: 
        !          1620:     pPriv = (WinPrivPtr) LookupID (pWin->wid, RT_WINDOW, wPrivClass);
        !          1621:     if (pPriv == (WinPrivPtr)0) {
        !          1622:        FatalError("apChangeWindowAttributes got null pPriv\n");
        !          1623:     }
        !          1624: 
        !          1625:     if ((char *)pWin->PaintWindowBackground !=(char *)apPaintWindowBackground){
        !          1626:        pPriv->PaintWindowBackground = pWin->PaintWindowBackground;
        !          1627:        pWin->PaintWindowBackground = apPaintWindowBackground;
        !          1628:     }
        !          1629:     if ((char *)pWin->PaintWindowBorder != (char *)apPaintWindowBorder) {
        !          1630:        pPriv->PaintWindowBorder = pWin->PaintWindowBorder;
        !          1631:        pWin->PaintWindowBorder = apPaintWindowBorder;
        !          1632:     }
        !          1633:     if ((char *)pWin->CopyWindow != (char *)apCopyWindow) {
        !          1634:        pPriv->CopyWindow = pWin->CopyWindow;
        !          1635:        pWin->CopyWindow = apCopyWindow;
        !          1636:     }
        !          1637: 
        !          1638:     return (TRUE);
        !          1639: }
        !          1640: 

unix.superglobalmegacorp.com

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