composite: Fix repaint of borders (v2)
When going from border width zero to a non-zero border width, the Composite extension is informed via the ConfigNotify callback. The call-chain looks like this: compConfigNotify -> compReallocPixmap -> compSetPixmap -> TraverseTree -> compSetPixmapVisitWindow. However, at this time, pWindow->borderWidth was not yet updated. Thus, HasBorder() is false and the window border will not be repainted. To fix this, thread the new bw through to the window visitor, and inspect that rather than HasBorder(). For the other callers of compSetPixmap the border does not change size, so we can pass pWin->borderWidth instead. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98499 Signed-off-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
75c4f6e412
commit
f31875510d
|
@ -612,7 +612,7 @@ compAllocPixmap(WindowPtr pWin)
|
|||
else
|
||||
pWin->redirectDraw = RedirectDrawManual;
|
||||
|
||||
compSetPixmap(pWin, pPixmap);
|
||||
compSetPixmap(pWin, pPixmap, bw);
|
||||
cw->oldx = COMP_ORIGIN_INVALID;
|
||||
cw->oldy = COMP_ORIGIN_INVALID;
|
||||
cw->damageRegistered = FALSE;
|
||||
|
@ -651,7 +651,7 @@ compSetParentPixmap(WindowPtr pWin)
|
|||
RegionCopy(&pWin->borderClip, &cw->borderClip);
|
||||
pParentPixmap = (*pScreen->GetWindowPixmap) (pWin->parent);
|
||||
pWin->redirectDraw = RedirectDrawNone;
|
||||
compSetPixmap(pWin, pParentPixmap);
|
||||
compSetPixmap(pWin, pParentPixmap, pWin->borderWidth);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -682,7 +682,7 @@ compReallocPixmap(WindowPtr pWin, int draw_x, int draw_y,
|
|||
if (!pNew)
|
||||
return FALSE;
|
||||
cw->pOldPixmap = pOld;
|
||||
compSetPixmap(pWin, pNew);
|
||||
compSetPixmap(pWin, pNew, bw);
|
||||
}
|
||||
else {
|
||||
pNew = pOld;
|
||||
|
|
|
@ -274,7 +274,7 @@ void
|
|||
#endif
|
||||
|
||||
void
|
||||
compSetPixmap(WindowPtr pWin, PixmapPtr pPixmap);
|
||||
compSetPixmap(WindowPtr pWin, PixmapPtr pPixmap, int bw);
|
||||
|
||||
Bool
|
||||
compCheckRedirect(WindowPtr pWin);
|
||||
|
|
|
@ -89,6 +89,7 @@ compCheckTree(ScreenPtr pScreen)
|
|||
typedef struct _compPixmapVisit {
|
||||
WindowPtr pWindow;
|
||||
PixmapPtr pPixmap;
|
||||
int bw;
|
||||
} CompPixmapVisitRec, *CompPixmapVisitPtr;
|
||||
|
||||
static Bool
|
||||
|
@ -126,19 +127,20 @@ compSetPixmapVisitWindow(WindowPtr pWindow, void *data)
|
|||
*/
|
||||
SetWinSize(pWindow);
|
||||
SetBorderSize(pWindow);
|
||||
if (HasBorder(pWindow))
|
||||
if (pVisit->bw)
|
||||
QueueWorkProc(compRepaintBorder, serverClient,
|
||||
(void *) (intptr_t) pWindow->drawable.id);
|
||||
return WT_WALKCHILDREN;
|
||||
}
|
||||
|
||||
void
|
||||
compSetPixmap(WindowPtr pWindow, PixmapPtr pPixmap)
|
||||
compSetPixmap(WindowPtr pWindow, PixmapPtr pPixmap, int bw)
|
||||
{
|
||||
CompPixmapVisitRec visitRec;
|
||||
|
||||
visitRec.pWindow = pWindow;
|
||||
visitRec.pPixmap = pPixmap;
|
||||
visitRec.bw = bw;
|
||||
TraverseTree(pWindow, compSetPixmapVisitWindow, (void *) &visitRec);
|
||||
compCheckTree(pWindow->drawable.pScreen);
|
||||
}
|
||||
|
@ -463,7 +465,8 @@ compReparentWindow(WindowPtr pWin, WindowPtr pPriorParent)
|
|||
* Reset pixmap pointers as appropriate
|
||||
*/
|
||||
if (pWin->parent && pWin->redirectDraw == RedirectDrawNone)
|
||||
compSetPixmap(pWin, (*pScreen->GetWindowPixmap) (pWin->parent));
|
||||
compSetPixmap(pWin, (*pScreen->GetWindowPixmap) (pWin->parent),
|
||||
pWin->borderWidth);
|
||||
/*
|
||||
* Call down to next function
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue