From ab95b569e1a390ea57fe8d2acd058b00767b8053 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Wed, 26 Feb 2025 17:56:57 +0100 Subject: [PATCH] Revert "mi: drop obsolete miOverlayCollectUnderlayRegions()" This reverts commit a860ce2c9f032a3ec54bde014d183db76715d23d. Requested by Nvidia - their proprietary driver still needs it. Signed-off-by: Enrico Weigelt, metux IT consult Part-of: --- mi/mioverlay.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ mi/mioverlay.h | 1 + 2 files changed, 59 insertions(+) diff --git a/mi/mioverlay.c b/mi/mioverlay.c index 83a4949a3..38c57ecaf 100644 --- a/mi/mioverlay.c +++ b/mi/mioverlay.c @@ -63,6 +63,7 @@ static DevPrivateKeyRec miOverlayScreenKeyRec; #define miOverlayScreenKey (&miOverlayScreenKeyRec) static void MarkUnderlayWindow(WindowPtr); +static Bool CollectUnderlayChildrenRegions(WindowPtr, RegionPtr); #define MIOVERLAY_GET_SCREEN_PRIVATE(pScreen) ((miOverlayScreenPtr) \ dixLookupPrivate(&(pScreen)->devPrivates, miOverlayScreenKey)) @@ -164,6 +165,63 @@ miOverlayComputeCompositeClip(GCPtr pGC, WindowPtr pWin) } } +Bool +miOverlayCollectUnderlayRegions(WindowPtr pWin, RegionPtr *region) +{ + miOverlayTreePtr pTree = MIOVERLAY_GET_WINDOW_TREE(pWin); + + if (pTree) { + *region = &pTree->borderClip; + return FALSE; + } + + *region = RegionCreate(NullBox, 0); + + CollectUnderlayChildrenRegions(pWin, *region); + + return TRUE; +} + +static Bool +CollectUnderlayChildrenRegions(WindowPtr pWin, RegionPtr pReg) +{ + WindowPtr pChild; + miOverlayTreePtr pTree; + Bool hasUnderlay; + + if (!(pChild = pWin->firstChild)) + return FALSE; + + hasUnderlay = FALSE; + + while (1) { + if ((pTree = MIOVERLAY_GET_WINDOW_TREE(pChild))) { + RegionAppend(pReg, &pTree->borderClip); + hasUnderlay = TRUE; + } + else if (pChild->firstChild) { + pChild = pChild->firstChild; + continue; + } + + while (!pChild->nextSib && (pWin != pChild)) + pChild = pChild->parent; + + if (pChild == pWin) + break; + + pChild = pChild->nextSib; + } + + if (hasUnderlay) { + Bool overlap; + + RegionValidate(pReg, &overlap); + } + + return hasUnderlay; +} + static void MarkUnderlayWindow(WindowPtr pWin) { diff --git a/mi/mioverlay.h b/mi/mioverlay.h index 5463a293c..2bd9d90cb 100644 --- a/mi/mioverlay.h +++ b/mi/mioverlay.h @@ -9,6 +9,7 @@ typedef void (*miOverlayTransFunc) (ScreenPtr, int, BoxPtr); typedef Bool (*miOverlayInOverlayFunc) (WindowPtr); +extern _X_EXPORT Bool miOverlayCollectUnderlayRegions(WindowPtr, RegionPtr *); extern _X_EXPORT void miOverlayComputeCompositeClip(GCPtr, WindowPtr); extern _X_EXPORT Bool miOverlayCopyUnderlay(ScreenPtr); extern _X_EXPORT void miOverlaySetRootClip(ScreenPtr, Bool);