Rootless: Correct border rendering on parent-relative windows

Resurected code from the punted RootlessPaintBackground/Border and added it conditionally to miPaintWindow
This commit is contained in:
Jeremy Huddleston 2009-09-27 23:09:51 -07:00
parent dadab5a227
commit cf2e3312cf
3 changed files with 48 additions and 0 deletions

View File

@ -518,6 +518,14 @@ miWindowExposures( WindowPtr pWin, RegionPtr prgn, RegionPtr other_exposed)
REGION_DESTROY( pWin->drawable.pScreen, exposures);
}
#ifdef ROOTLESS
/* Ugly, ugly, but we lost our hooks into miPaintWindow... =/ */
void RootlessSetPixmapOfAncestors(WindowPtr pWin);
void RootlessStartDrawing(WindowPtr pWin);
void RootlessDamageRegion(WindowPtr pWin, RegionPtr prgn);
Bool IsFramedWindow(WindowPtr pWin);
#endif
void
miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
{
@ -543,6 +551,19 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
Bool solid = TRUE;
DrawablePtr drawable = &pWin->drawable;
#ifdef ROOTLESS
if(IsFramedWindow(pWin)) {
RootlessStartDrawing(pWin);
RootlessDamageRegion(pWin, prgn);
if(pWin->backgroundState == ParentRelative) {
if((what == PW_BACKGROUND) ||
(what == PW_BORDER && !pWin->borderIsPixel))
RootlessSetPixmapOfAncestors(pWin);
}
}
#endif
if (what == PW_BACKGROUND)
{
while (pWin->backgroundState == ParentRelative)

View File

@ -1,3 +1,4 @@
/***********************************************************
Copyright 1987, 1998 The Open Group

View File

@ -1684,3 +1684,29 @@ RootlessShowAllWindows (void)
RootlessScreenExpose (pScreen);
}
}
/*
* SetPixmapOfAncestors
* Set the Pixmaps on all ParentRelative windows up the ancestor chain.
*/
void
RootlessSetPixmapOfAncestors(WindowPtr pWin)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
WindowPtr topWin = TopLevelParent(pWin);
RootlessWindowRec *topWinRec = WINREC(topWin);
while (pWin->backgroundState == ParentRelative) {
if (pWin == topWin) {
// disallow ParentRelative background state on top level
XID pixel = 0;
ChangeWindowAttributes(pWin, CWBackPixel, &pixel, serverClient);
RL_DEBUG_MSG("Cleared ParentRelative on 0x%x.\n", pWin);
break;
}
pWin = pWin->parent;
pScreen->SetWindowPixmap(pWin, topWinRec->pixmap);
}
}