Better handling of redirected windows.

This commit is contained in:
David Reveman 2008-06-07 09:00:34 -04:00
parent 01a74f4b2e
commit 2e54ce1038
3 changed files with 59 additions and 47 deletions

View file

@ -1490,37 +1490,10 @@ dmxSetWindowPixmap (WindowPtr pWin, PixmapPtr pPixmap)
{
dmxWinPrivPtr pWinPriv = DMX_GET_WINDOW_PRIV (pWin);
if (pPixmap)
{
if ((*pScreen->GetWindowPixmap) (pWin->parent) != pPixmap)
{
pWinPriv->redirected = TRUE;
}
else if (pWinPriv->redirected)
{
if (dmxScreen->beDisplay)
{
XLIB_PROLOGUE (dmxScreen);
XCompositeUnredirectWindow (dmxScreen->beDisplay,
pWinPriv->window,
CompositeRedirectManual);
XLIB_EPILOGUE (dmxScreen);
}
pWinPriv->redirected = FALSE;
}
}
else if (pWinPriv->redirected)
{
if (dmxScreen->beDisplay)
{
XLIB_PROLOGUE (dmxScreen);
XCompositeUnredirectWindow (dmxScreen->beDisplay,
pWinPriv->window,
CompositeRedirectManual);
XLIB_EPILOGUE (dmxScreen);
}
if (pPixmap && (*pScreen->GetWindowPixmap) (pWin->parent) != pPixmap)
pWinPriv->redirected = TRUE;
else
pWinPriv->redirected = FALSE;
}
}
DMX_UNWRAP(SetWindowPixmap, dmxScreen, pScreen);
@ -1567,6 +1540,7 @@ dmxScreenExpose (ScreenPtr pScreen)
if (pChild0->firstChild)
{
assert (pChildN->firstChild);
pChild0 = pChild0->firstChild;
pChildN = pChildN->firstChild;
continue;
@ -1574,12 +1548,17 @@ dmxScreenExpose (ScreenPtr pScreen)
while (!pChild0->nextSib && (pChild0 != WindowTable[0]))
{
assert (!pChildN->nextSib &&
(pChildN != WindowTable[pScreen->myNum]));
pChild0 = pChild0->parent;
pChildN = pChildN->parent;
}
if (pChild0 == WindowTable[0])
{
assert (pChildN == WindowTable[pScreen->myNum]);
break;
}
pChild0 = pChild0->nextSib;
pChildN = pChildN->nextSib;

View file

@ -352,6 +352,7 @@ Bool dmxCreateWindow(WindowPtr pWindow)
pWinPriv->mapped = FALSE;
pWinPriv->restacked = FALSE;
pWinPriv->redirected = FALSE;
pWinPriv->wasRedirected = FALSE;
pWinPriv->attribMask = 0;
pWinPriv->isShaped = FALSE;
#ifdef RENDER
@ -674,28 +675,48 @@ Bool dmxRealizeWindow(WindowPtr pWindow)
if (pPixmap)
{
dmxPixPrivPtr pPixPriv = DMX_GET_PIXMAP_PRIV (pPixmap);
Bool updatePixmap = !pWinPriv->wasRedirected;
XLIB_PROLOGUE (dmxScreen);
XCompositeRedirectWindow (dmxScreen->beDisplay,
pWinPriv->window,
CompositeRedirectManual);
if (pPixPriv->pixmap)
if (!pWinPriv->wasRedirected)
{
XFreePixmap (dmxScreen->beDisplay, pPixPriv->pixmap);
pPixPriv->pixmap = None;
XLIB_PROLOGUE (dmxScreen);
XCompositeRedirectWindow (dmxScreen->beDisplay,
pWinPriv->window,
CompositeRedirectManual);
XLIB_EPILOGUE (dmxScreen);
pWinPriv->wasRedirected = TRUE;
}
dmxSetIgnore (dmxScreen, NextRequest (dmxScreen->beDisplay));
XMapWindow (dmxScreen->beDisplay, pWinPriv->window);
if (MapUnmapEventsEnabled (pWindow))
{
XLIB_PROLOGUE (dmxScreen);
dmxSetIgnore (dmxScreen,
NextRequest (dmxScreen->beDisplay));
XMapWindow (dmxScreen->beDisplay, pWinPriv->window);
updatePixmap = TRUE;
XLIB_EPILOGUE (dmxScreen);
}
pPixPriv->pixmap =
XCompositeNameWindowPixmap (dmxScreen->beDisplay,
pWinPriv->window);
XLIB_EPILOGUE (dmxScreen);
if (updatePixmap)
{
if (pPixPriv->pixmap)
{
XLIB_PROLOGUE (dmxScreen);
XFreePixmap (dmxScreen->beDisplay, pPixPriv->pixmap);
XLIB_EPILOGUE (dmxScreen);
pPixPriv->pixmap = None;
}
XLIB_PROLOGUE (dmxScreen);
pPixPriv->pixmap =
XCompositeNameWindowPixmap (dmxScreen->beDisplay,
pWinPriv->window);
XLIB_EPILOGUE (dmxScreen);
pWinPriv->wasRedirected = TRUE;
}
}
}
else
else if (MapUnmapEventsEnabled (pWindow))
{
XLIB_PROLOGUE (dmxScreen);
dmxSetIgnore (dmxScreen, NextRequest (dmxScreen->beDisplay));
@ -731,9 +752,20 @@ Bool dmxUnrealizeWindow(WindowPtr pWindow)
if (pWinPriv->window) {
/* Unrealize window on back-end server */
XLIB_PROLOGUE (dmxScreen);
dmxSetIgnore (dmxScreen, NextRequest (dmxScreen->beDisplay));
XUnmapWindow(dmxScreen->beDisplay, pWinPriv->window);
if (MapUnmapEventsEnabled (pWindow))
{
dmxSetIgnore (dmxScreen, NextRequest (dmxScreen->beDisplay));
XUnmapWindow(dmxScreen->beDisplay, pWinPriv->window);
}
if (!pWinPriv->redirected && pWinPriv->wasRedirected)
{
XCompositeUnredirectWindow (dmxScreen->beDisplay,
pWinPriv->window,
CompositeRedirectManual);
pWinPriv->wasRedirected = FALSE;
}
XLIB_EPILOGUE (dmxScreen);
dmxSync(dmxScreen, False);
}

View file

@ -46,6 +46,7 @@ typedef struct _dmxWinPriv {
Bool mapped;
Bool restacked;
Bool redirected;
Bool wasRedirected;
unsigned long attribMask;
Colormap cmap;
Visual *visual;