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:
Adam Jackson 2016-12-06 14:11:11 -05:00
parent 75c4f6e412
commit f31875510d
3 changed files with 10 additions and 7 deletions

View File

@ -612,7 +612,7 @@ compAllocPixmap(WindowPtr pWin)
else else
pWin->redirectDraw = RedirectDrawManual; pWin->redirectDraw = RedirectDrawManual;
compSetPixmap(pWin, pPixmap); compSetPixmap(pWin, pPixmap, bw);
cw->oldx = COMP_ORIGIN_INVALID; cw->oldx = COMP_ORIGIN_INVALID;
cw->oldy = COMP_ORIGIN_INVALID; cw->oldy = COMP_ORIGIN_INVALID;
cw->damageRegistered = FALSE; cw->damageRegistered = FALSE;
@ -651,7 +651,7 @@ compSetParentPixmap(WindowPtr pWin)
RegionCopy(&pWin->borderClip, &cw->borderClip); RegionCopy(&pWin->borderClip, &cw->borderClip);
pParentPixmap = (*pScreen->GetWindowPixmap) (pWin->parent); pParentPixmap = (*pScreen->GetWindowPixmap) (pWin->parent);
pWin->redirectDraw = RedirectDrawNone; 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) if (!pNew)
return FALSE; return FALSE;
cw->pOldPixmap = pOld; cw->pOldPixmap = pOld;
compSetPixmap(pWin, pNew); compSetPixmap(pWin, pNew, bw);
} }
else { else {
pNew = pOld; pNew = pOld;

View File

@ -274,7 +274,7 @@ void
#endif #endif
void void
compSetPixmap(WindowPtr pWin, PixmapPtr pPixmap); compSetPixmap(WindowPtr pWin, PixmapPtr pPixmap, int bw);
Bool Bool
compCheckRedirect(WindowPtr pWin); compCheckRedirect(WindowPtr pWin);

View File

@ -89,6 +89,7 @@ compCheckTree(ScreenPtr pScreen)
typedef struct _compPixmapVisit { typedef struct _compPixmapVisit {
WindowPtr pWindow; WindowPtr pWindow;
PixmapPtr pPixmap; PixmapPtr pPixmap;
int bw;
} CompPixmapVisitRec, *CompPixmapVisitPtr; } CompPixmapVisitRec, *CompPixmapVisitPtr;
static Bool static Bool
@ -126,19 +127,20 @@ compSetPixmapVisitWindow(WindowPtr pWindow, void *data)
*/ */
SetWinSize(pWindow); SetWinSize(pWindow);
SetBorderSize(pWindow); SetBorderSize(pWindow);
if (HasBorder(pWindow)) if (pVisit->bw)
QueueWorkProc(compRepaintBorder, serverClient, QueueWorkProc(compRepaintBorder, serverClient,
(void *) (intptr_t) pWindow->drawable.id); (void *) (intptr_t) pWindow->drawable.id);
return WT_WALKCHILDREN; return WT_WALKCHILDREN;
} }
void void
compSetPixmap(WindowPtr pWindow, PixmapPtr pPixmap) compSetPixmap(WindowPtr pWindow, PixmapPtr pPixmap, int bw)
{ {
CompPixmapVisitRec visitRec; CompPixmapVisitRec visitRec;
visitRec.pWindow = pWindow; visitRec.pWindow = pWindow;
visitRec.pPixmap = pPixmap; visitRec.pPixmap = pPixmap;
visitRec.bw = bw;
TraverseTree(pWindow, compSetPixmapVisitWindow, (void *) &visitRec); TraverseTree(pWindow, compSetPixmapVisitWindow, (void *) &visitRec);
compCheckTree(pWindow->drawable.pScreen); compCheckTree(pWindow->drawable.pScreen);
} }
@ -463,7 +465,8 @@ compReparentWindow(WindowPtr pWin, WindowPtr pPriorParent)
* Reset pixmap pointers as appropriate * Reset pixmap pointers as appropriate
*/ */
if (pWin->parent && pWin->redirectDraw == RedirectDrawNone) 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 * Call down to next function
*/ */