diff --git a/mi/mioverlay.c b/mi/mioverlay.c index 23cc2b366..0c1d79d70 100644 --- a/mi/mioverlay.c +++ b/mi/mioverlay.c @@ -54,3 +54,59 @@ typedef struct { Bool underlayMarked; Bool copyUnderlay; } miOverlayScreenRec, *miOverlayScreenPtr; + +static DevPrivateKeyRec miOverlayWindowKeyRec; + +#define miOverlayWindowKey (&miOverlayWindowKeyRec) + +static void MarkUnderlayWindow(WindowPtr); + +#define MIOVERLAY_GET_WINDOW_PRIVATE(pWin) ((miOverlayWindowPtr) \ + dixLookupPrivate(&(pWin)->devPrivates, miOverlayWindowKey)) +#define MIOVERLAY_GET_WINDOW_TREE(pWin) \ + (MIOVERLAY_GET_WINDOW_PRIVATE(pWin)->tree) + +#define MARK_UNDERLAY(w) MarkUnderlayWindow(w) + +/* We need this as an addition since the xf86 common code doesn't + know about the second tree which is static to this file. */ + +void +miOverlaySetRootClip(ScreenPtr pScreen, Bool enable) +{ + WindowPtr pRoot = pScreen->root; + miOverlayTreePtr pTree = MIOVERLAY_GET_WINDOW_TREE(pRoot); + + MARK_UNDERLAY(pRoot); + + if (enable) { + BoxRec box; + + box.x1 = 0; + box.y1 = 0; + box.x2 = pScreen->width; + box.y2 = pScreen->height; + + RegionReset(&pTree->borderClip, &box); + } + else + RegionEmpty(&pTree->borderClip); + + RegionBreak(&pTree->clipList); +} + +/****************************************************************/ + +static void +MarkUnderlayWindow(WindowPtr pWin) +{ + miOverlayTreePtr pTree = MIOVERLAY_GET_WINDOW_TREE(pWin); + + if (pTree->valdata) + return; + pTree->valdata = + (miOverlayValDataPtr) XNFalloc(sizeof(miOverlayValDataRec)); + pTree->valdata->oldAbsCorner.x = pWin->drawable.x; + pTree->valdata->oldAbsCorner.y = pWin->drawable.y; + pTree->valdata->borderVisible = NullRegion; +} diff --git a/mi/mioverlay.h b/mi/mioverlay.h index 857491dd3..68a88260a 100644 --- a/mi/mioverlay.h +++ b/mi/mioverlay.h @@ -9,4 +9,6 @@ typedef void (*miOverlayTransFunc) (ScreenPtr, int, BoxPtr); typedef Bool (*miOverlayInOverlayFunc) (WindowPtr); +extern _X_EXPORT void miOverlaySetRootClip(ScreenPtr, Bool); + #endif /* __MIOVERLAY_H */