mirror of
https://github.com/X11Libre/xserver.git
synced 2026-10-01 22:03:09 +00:00
consolidate SetRootClip (v2)
each DDX has its own copy, I've taken the darwin one, though I'm not sure why it needs the pOldClip piece that nobody else has and the commit msg is like an "Updates from magic land" type message. This removes the main uses of pWin->winSize from the DDXen. v2: drop old clip like ajax suggests. Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
03f45df934
commit
eb9266c717
9 changed files with 111 additions and 410 deletions
103
dix/window.c
103
dix/window.c
|
|
@ -116,6 +116,7 @@ Equipment Corporation.
|
|||
#include "dixstruct.h"
|
||||
#include "gcstruct.h"
|
||||
#include "servermd.h"
|
||||
#include "mivalidate.h"
|
||||
#ifdef PANORAMIX
|
||||
#include "panoramiX.h"
|
||||
#include "panoramiXsrv.h"
|
||||
|
|
@ -3684,3 +3685,105 @@ WindowParentHasDeviceCursor(WindowPtr pWin,
|
|||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* SetRootClip --
|
||||
* Enable or disable rendering to the screen by
|
||||
* setting the root clip list and revalidating
|
||||
* all of the windows
|
||||
*/
|
||||
void
|
||||
SetRootClip(ScreenPtr pScreen, Bool enable)
|
||||
{
|
||||
WindowPtr pWin = pScreen->root;
|
||||
WindowPtr pChild;
|
||||
Bool WasViewable;
|
||||
Bool anyMarked = FALSE;
|
||||
WindowPtr pLayerWin;
|
||||
BoxRec box;
|
||||
|
||||
if (!pWin)
|
||||
return;
|
||||
WasViewable = (Bool)(pWin->viewable);
|
||||
if (WasViewable)
|
||||
{
|
||||
for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib)
|
||||
{
|
||||
(void) (*pScreen->MarkOverlappedWindows)(pChild,
|
||||
pChild,
|
||||
&pLayerWin);
|
||||
}
|
||||
(*pScreen->MarkWindow) (pWin);
|
||||
anyMarked = TRUE;
|
||||
if (pWin->valdata)
|
||||
{
|
||||
if (HasBorder (pWin))
|
||||
{
|
||||
RegionPtr borderVisible;
|
||||
|
||||
borderVisible = RegionCreate(NullBox, 1);
|
||||
RegionSubtract(borderVisible,
|
||||
&pWin->borderClip, &pWin->winSize);
|
||||
pWin->valdata->before.borderVisible = borderVisible;
|
||||
}
|
||||
pWin->valdata->before.resized = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Use REGION_BREAK to avoid optimizations in ValidateTree
|
||||
* that assume the root borderClip can't change well, normally
|
||||
* it doesn't...)
|
||||
*/
|
||||
if (enable)
|
||||
{
|
||||
box.x1 = 0;
|
||||
box.y1 = 0;
|
||||
box.x2 = pScreen->width;
|
||||
box.y2 = pScreen->height;
|
||||
RegionInit(&pWin->winSize, &box, 1);
|
||||
RegionInit(&pWin->borderSize, &box, 1);
|
||||
if (WasViewable)
|
||||
RegionReset(&pWin->borderClip, &box);
|
||||
pWin->drawable.width = pScreen->width;
|
||||
pWin->drawable.height = pScreen->height;
|
||||
RegionBreak(&pWin->clipList);
|
||||
}
|
||||
else
|
||||
{
|
||||
RegionEmpty(&pWin->borderClip);
|
||||
RegionBreak(&pWin->clipList);
|
||||
}
|
||||
|
||||
ResizeChildrenWinSize (pWin, 0, 0, 0, 0);
|
||||
|
||||
if (WasViewable)
|
||||
{
|
||||
if (pWin->firstChild)
|
||||
{
|
||||
anyMarked |= (*pScreen->MarkOverlappedWindows)(pWin->firstChild,
|
||||
pWin->firstChild,
|
||||
(WindowPtr *)NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
(*pScreen->MarkWindow) (pWin);
|
||||
anyMarked = TRUE;
|
||||
}
|
||||
|
||||
|
||||
if (anyMarked)
|
||||
(*pScreen->ValidateTree)(pWin, NullWindow, VTOther);
|
||||
}
|
||||
|
||||
if (WasViewable)
|
||||
{
|
||||
if (anyMarked)
|
||||
(*pScreen->HandleExposures)(pWin);
|
||||
if (anyMarked && pScreen->PostValidateTree)
|
||||
(*pScreen->PostValidateTree)(pWin, NullWindow, VTOther);
|
||||
}
|
||||
if (pWin->realized)
|
||||
WindowsRestructured ();
|
||||
FlushAllOutput();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue