diff --git a/hw/dmx/dmxscrinit.c b/hw/dmx/dmxscrinit.c index c74de7063..9a2a8cf5a 100644 --- a/hw/dmx/dmxscrinit.c +++ b/hw/dmx/dmxscrinit.c @@ -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; diff --git a/hw/dmx/dmxwindow.c b/hw/dmx/dmxwindow.c index 94561797b..6281cb109 100644 --- a/hw/dmx/dmxwindow.c +++ b/hw/dmx/dmxwindow.c @@ -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); } diff --git a/hw/dmx/dmxwindow.h b/hw/dmx/dmxwindow.h index 7a864d6ed..e7199ae61 100644 --- a/hw/dmx/dmxwindow.h +++ b/hw/dmx/dmxwindow.h @@ -46,6 +46,7 @@ typedef struct _dmxWinPriv { Bool mapped; Bool restacked; Bool redirected; + Bool wasRedirected; unsigned long attribMask; Colormap cmap; Visual *visual;