static void ShadowCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgn) { ScreenPtr pScreen = pWin->drawable.pScreen; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); int num = 0; RegionRec rgnDst; if (pPriv->vtSema) { RegionNull(&rgnDst); RegionCopy(&rgnDst, prgn); RegionTranslate(&rgnDst, pWin->drawable.x - ptOldOrg.x, pWin->drawable.y - ptOldOrg.y); RegionIntersect(&rgnDst, &pWin->borderClip, &rgnDst); if ((num = RegionNumRects(&rgnDst))) { if (pPriv->preRefresh) (*pPriv->preRefresh) (pPriv->pScrn, num, RegionRects(&rgnDst)); } else { RegionUninit(&rgnDst); } } pScreen->CopyWindow = pPriv->CopyWindow; (*pScreen->CopyWindow) (pWin, ptOldOrg, prgn); pScreen->CopyWindow = ShadowCopyWindow; if (num) { if (pPriv->postRefresh) (*pPriv->postRefresh) (pPriv->pScrn, num, RegionRects(&rgnDst)); RegionUninit(&rgnDst); } }
static Bool ShadowCloseScreen (int i, ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); #ifdef RENDER PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); #endif /* RENDER */ pScreen->CloseScreen = pPriv->CloseScreen; pScreen->CopyWindow = pPriv->CopyWindow; pScreen->CreateGC = pPriv->CreateGC; pScreen->ModifyPixmapHeader = pPriv->ModifyPixmapHeader; pScrn->EnterVT = pPriv->EnterVT; pScrn->LeaveVT = pPriv->LeaveVT; #ifdef RENDER if(ps) { ps->Composite = pPriv->Composite; } #endif /* RENDER */ xfree((pointer)pPriv); return (*pScreen->CloseScreen) (i, pScreen); }
static void ShadowPaintWindow( WindowPtr pWin, RegionPtr prgn, int what ){ ScreenPtr pScreen = pWin->drawable.pScreen; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); int num = 0; if(pPriv->vtSema && (num = REGION_NUM_RECTS(prgn))) if(pPriv->preRefresh) (*pPriv->preRefresh)(pPriv->pScrn, num, REGION_RECTS(prgn)); if(what == PW_BACKGROUND) { pScreen->PaintWindowBackground = pPriv->PaintWindowBackground; (*pScreen->PaintWindowBackground) (pWin, prgn, what); pScreen->PaintWindowBackground = ShadowPaintWindow; } else { pScreen->PaintWindowBorder = pPriv->PaintWindowBorder; (*pScreen->PaintWindowBorder) (pWin, prgn, what); pScreen->PaintWindowBorder = ShadowPaintWindow; } if(num && pPriv->postRefresh) (*pPriv->postRefresh)(pPriv->pScrn, num, REGION_RECTS(prgn)); }
static void ShadowLeaveVT(int index, int flags) { ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(xf86Screens[index]->pScreen); pPriv->vtSema = FALSE; (*pPriv->LeaveVT)(index, flags); }
static void ShadowComposite( CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height ){ ScreenPtr pScreen = pDst->pDrawable->pScreen; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); PictureScreenPtr ps = GetPictureScreen(pScreen); BoxRec box; BoxPtr extents; Bool boxNotEmpty = FALSE; if (pPriv->vtSema && pDst->pDrawable->type == DRAWABLE_WINDOW) { box.x1 = pDst->pDrawable->x + xDst; box.y1 = pDst->pDrawable->y + yDst; box.x2 = box.x1 + width; box.y2 = box.y1 + height; extents = &pDst->pCompositeClip->extents; if(box.x1 < extents->x1) box.x1 = extents->x1; if(box.x2 > extents->x2) box.x2 = extents->x2; if(box.y1 < extents->y1) box.y1 = extents->y1; if(box.y2 > extents->y2) box.y2 = extents->y2; if (BOX_NOT_EMPTY(box)) { if (pPriv->preRefresh) (*pPriv->preRefresh)(pPriv->pScrn, 1, &box); boxNotEmpty = TRUE; } } ps->Composite = pPriv->Composite; (*ps->Composite)(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height); ps->Composite = ShadowComposite; if (pPriv->postRefresh && boxNotEmpty) { (*pPriv->postRefresh)(pPriv->pScrn, 1, &box); } }
static void ShadowLeaveVT(int index, int flags) { ScrnInfoPtr pScrn = xf86Screens[index]; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(xf86Screens[index]->pScreen); pPriv->vtSema = FALSE; pScrn->LeaveVT = pPriv->LeaveVT; (*pPriv->LeaveVT)(index, flags); pPriv->LeaveVT = pScrn->LeaveVT; pScrn->LeaveVT = ShadowLeaveVT; }
static Bool ShadowEnterVT(int index, int flags) { ScrnInfoPtr pScrn = xf86Screens[index]; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScrn->pScreen); if((*pPriv->EnterVT)(index, flags)) { pPriv->vtSema = TRUE; return TRUE; } return FALSE; }
static Bool ShadowCreateGC(GCPtr pGC) { ScreenPtr pScreen = pGC->pScreen; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); ShadowGCPtr pGCPriv = GET_GC_PRIVATE(pGC); Bool ret; pScreen->CreateGC = pPriv->CreateGC; if((ret = (*pScreen->CreateGC) (pGC))) { pGCPriv->ops = NULL; pGCPriv->funcs = pGC->funcs; pGC->funcs = &ShadowGCFuncs; } pScreen->CreateGC = ShadowCreateGC; return ret; }
static Bool ShadowModifyPixmapHeader( PixmapPtr pPixmap, int width, int height, int depth, int bitsPerPixel, int devKind, pointer pPixData ) { ScreenPtr pScreen; ScrnInfoPtr pScrn; ShadowScreenPtr pPriv; Bool retval; PixmapPtr pScreenPix; if (!pPixmap) return FALSE; pScreen = pPixmap->drawable.pScreen; pScrn = xf86Screens[pScreen->myNum]; pScreenPix = (*pScreen->GetScreenPixmap)(pScreen); if (pPixmap == pScreenPix && !pScrn->vtSema) pScreenPix->devPrivate = pScrn->pixmapPrivate; pPriv = GET_SCREEN_PRIVATE(pScreen); pScreen->ModifyPixmapHeader = pPriv->ModifyPixmapHeader; retval = (*pScreen->ModifyPixmapHeader)(pPixmap, width, height, depth, bitsPerPixel, devKind, pPixData); pScreen->ModifyPixmapHeader = ShadowModifyPixmapHeader; if (pPixmap == pScreenPix && !pScrn->vtSema) { pScrn->pixmapPrivate = pScreenPix->devPrivate; pScreenPix->devPrivate.ptr = 0; } return retval; }
static void ShadowCopyWindow( WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgn ){ ScreenPtr pScreen = pWin->drawable.pScreen; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); int num = 0; RegionRec rgnDst; if (pPriv->vtSema) { REGION_NULL(pWin->drawable.pScreen, &rgnDst); REGION_COPY(pWin->drawable.pScreen, &rgnDst, prgn); REGION_TRANSLATE(pWin->drawable.pScreen, &rgnDst, pWin->drawable.x - ptOldOrg.x, pWin->drawable.y - ptOldOrg.y); REGION_INTERSECT(pScreen, &rgnDst, &pWin->borderClip, &rgnDst); if ((num = REGION_NUM_RECTS(&rgnDst))) { if(pPriv->preRefresh) (*pPriv->preRefresh)(pPriv->pScrn, num, REGION_RECTS(&rgnDst)); } else { REGION_UNINIT(pWin->drawable.pScreen, &rgnDst); } } pScreen->CopyWindow = pPriv->CopyWindow; (*pScreen->CopyWindow) (pWin, ptOldOrg, prgn); pScreen->CopyWindow = ShadowCopyWindow; if (num) { if (pPriv->postRefresh) (*pPriv->postRefresh)(pPriv->pScrn, num, REGION_RECTS(&rgnDst)); REGION_UNINIT(pWin->drawable.pScreen, &rgnDst); } }
static void ShadowRestoreAreas ( PixmapPtr pPixmap, RegionPtr prgn, int xorg, int yorg, WindowPtr pWin ){ ScreenPtr pScreen = pWin->drawable.pScreen; ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen); int num = 0; if(pPriv->vtSema && (num = REGION_NUM_RECTS(prgn))) if(pPriv->preRefresh) (*pPriv->preRefresh)(pPriv->pScrn, num, REGION_RECTS(prgn)); pScreen->BackingStoreFuncs.RestoreAreas = pPriv->RestoreAreas; (*pScreen->BackingStoreFuncs.RestoreAreas) ( pPixmap, prgn, xorg, yorg, pWin); pScreen->BackingStoreFuncs.RestoreAreas = ShadowRestoreAreas; if(num && pPriv->postRefresh) (*pPriv->postRefresh)(pPriv->pScrn, num, REGION_RECTS(prgn)); }