mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-02-13 12:50:40 +01:00
Better handling of redirected windows.
This commit is contained in:
parent
01a74f4b2e
commit
2e54ce1038
3 changed files with 59 additions and 47 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ typedef struct _dmxWinPriv {
|
|||
Bool mapped;
|
||||
Bool restacked;
|
||||
Bool redirected;
|
||||
Bool wasRedirected;
|
||||
unsigned long attribMask;
|
||||
Colormap cmap;
|
||||
Visual *visual;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue