forked from pool/xorg-x11-server
133 lines
3.7 KiB
Diff
133 lines
3.7 KiB
Diff
# On branch master
|
|
# Changes to be committed:
|
|
# (use "git reset HEAD <file>..." to unstage)
|
|
#
|
|
# modified: composite/compalloc.c
|
|
# modified: composite/compint.h
|
|
# modified: composite/compwindow.c
|
|
#
|
|
# Untracked files:
|
|
# (use "git add <file>..." to include in what will be committed)
|
|
#
|
|
# randr/rrscreen.c.orig
|
|
diff --git a/composite/compalloc.c b/composite/compalloc.c
|
|
index f555411..006e808 100644
|
|
--- a/composite/compalloc.c
|
|
+++ b/composite/compalloc.c
|
|
@@ -461,7 +461,6 @@ compNewPixmap (WindowPtr pWin, int x, int y, int w, int h)
|
|
ScreenPtr pScreen = pWin->drawable.pScreen;
|
|
WindowPtr pParent = pWin->parent;
|
|
PixmapPtr pPixmap;
|
|
- GCPtr pGC;
|
|
|
|
pPixmap = (*pScreen->CreatePixmap) (pScreen, w, h, pWin->drawable.depth);
|
|
|
|
@@ -471,25 +470,63 @@ compNewPixmap (WindowPtr pWin, int x, int y, int w, int h)
|
|
pPixmap->screen_x = x;
|
|
pPixmap->screen_y = y;
|
|
|
|
- pGC = GetScratchGC (pWin->drawable.depth, pScreen);
|
|
-
|
|
- /*
|
|
- * Copy bits from the parent into the new pixmap so that it will
|
|
- * have "reasonable" contents in case for background None areas.
|
|
- */
|
|
- if (pGC)
|
|
+ if (pParent->drawable.depth == pWin->drawable.depth)
|
|
{
|
|
- XID val = IncludeInferiors;
|
|
+ GCPtr pGC = GetScratchGC (pWin->drawable.depth, pScreen);
|
|
|
|
- ValidateGC(&pPixmap->drawable, pGC);
|
|
- dixChangeGC (serverClient, pGC, GCSubwindowMode, &val, NULL);
|
|
- (*pGC->ops->CopyArea) (&pParent->drawable,
|
|
- &pPixmap->drawable,
|
|
- pGC,
|
|
- x - pParent->drawable.x,
|
|
- y - pParent->drawable.y,
|
|
- w, h, 0, 0);
|
|
- FreeScratchGC (pGC);
|
|
+ /*
|
|
+ * Copy bits from the parent into the new pixmap so that it will
|
|
+ * have "reasonable" contents in case for background None areas.
|
|
+ */
|
|
+ if (pGC)
|
|
+ {
|
|
+ XID val = IncludeInferiors;
|
|
+
|
|
+ ValidateGC(&pPixmap->drawable, pGC);
|
|
+ dixChangeGC (serverClient, pGC, GCSubwindowMode, &val, NULL);
|
|
+ (*pGC->ops->CopyArea) (&pParent->drawable,
|
|
+ &pPixmap->drawable,
|
|
+ pGC,
|
|
+ x - pParent->drawable.x,
|
|
+ y - pParent->drawable.y,
|
|
+ w, h, 0, 0);
|
|
+ FreeScratchGC (pGC);
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ PictFormatPtr pSrcFormat = compWindowFormat (pParent);
|
|
+ PictFormatPtr pDstFormat = compWindowFormat (pWin);
|
|
+ XID inferiors = IncludeInferiors;
|
|
+ int error;
|
|
+
|
|
+ PicturePtr pSrcPicture = CreatePicture (None,
|
|
+ &pParent->drawable,
|
|
+ pSrcFormat,
|
|
+ CPSubwindowMode,
|
|
+ &inferiors,
|
|
+ serverClient, &error);
|
|
+
|
|
+ PicturePtr pDstPicture = CreatePicture (None,
|
|
+ &pPixmap->drawable,
|
|
+ pDstFormat,
|
|
+ 0, 0,
|
|
+ serverClient, &error);
|
|
+
|
|
+ if (pSrcPicture && pDstPicture)
|
|
+ {
|
|
+ CompositePicture (PictOpSrc,
|
|
+ pSrcPicture,
|
|
+ NULL,
|
|
+ pDstPicture,
|
|
+ x - pParent->drawable.x,
|
|
+ y - pParent->drawable.y,
|
|
+ 0, 0, 0, 0, w, h);
|
|
+ }
|
|
+ if (pSrcPicture)
|
|
+ FreePicture (pSrcPicture, 0);
|
|
+ if (pDstPicture)
|
|
+ FreePicture (pDstPicture, 0);
|
|
}
|
|
return pPixmap;
|
|
}
|
|
diff --git a/composite/compint.h b/composite/compint.h
|
|
index 38b1777..f69595c 100644
|
|
--- a/composite/compint.h
|
|
+++ b/composite/compint.h
|
|
@@ -237,6 +237,9 @@ compCheckTree (ScreenPtr pScreen);
|
|
#define compCheckTree(s)
|
|
#endif
|
|
|
|
+PictFormatPtr
|
|
+compWindowFormat (WindowPtr pWin);
|
|
+
|
|
void
|
|
compSetPixmap (WindowPtr pWin, PixmapPtr pPixmap);
|
|
|
|
diff --git a/composite/compwindow.c b/composite/compwindow.c
|
|
index a4c4e6f..bfd2946 100644
|
|
--- a/composite/compwindow.c
|
|
+++ b/composite/compwindow.c
|
|
@@ -685,7 +685,7 @@ compGetWindowVisual (WindowPtr pWin)
|
|
return 0;
|
|
}
|
|
|
|
-static PictFormatPtr
|
|
+PictFormatPtr
|
|
compWindowFormat (WindowPtr pWin)
|
|
{
|
|
ScreenPtr pScreen = pWin->drawable.pScreen;
|