summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@nokia.com>2011-01-05 20:41:07 +0200
committerKeith Packard <keithp@keithp.com>2011-01-05 11:57:04 -0800
commit84154954db54696d4661eb8d0a6014cdbff3c91f (patch)
tree17d57230419475fc0f007b082f8ee9ed447f6fac
parenta5dc3531e14589ac473cea482944d2d67517aabd (diff)
composite: Add GetImage wrapper
When GetImage is performed on a window, force an immediate update of all the automatically redirected windows, so that the current window contents will be up to date. Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com> Reviewed-by: Keith Packard <keithp@keithp.com> Reviewed-by: Daniel Stone <daniel@fooishbar.org> Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--composite/compalloc.c2
-rw-r--r--composite/compinit.c24
-rw-r--r--composite/compint.h4
3 files changed, 29 insertions, 1 deletions
diff --git a/composite/compalloc.c b/composite/compalloc.c
index 86a6f8ea9..b2e3f7165 100644
--- a/composite/compalloc.c
+++ b/composite/compalloc.c
@@ -47,7 +47,7 @@
#include "compint.h"
-static void
+void
compScreenUpdate (ScreenPtr pScreen)
{
compCheckTree (pScreen);
diff --git a/composite/compinit.c b/composite/compinit.c
index 276ed75f8..e1a765684 100644
--- a/composite/compinit.c
+++ b/composite/compinit.c
@@ -77,6 +77,8 @@ compCloseScreen (int index, ScreenPtr pScreen)
pScreen->CopyWindow = cs->CopyWindow;
pScreen->PositionWindow = cs->PositionWindow;
+ pScreen->GetImage = cs->GetImage;
+
free(cs);
dixSetPrivate(&pScreen->devPrivates, CompScreenPrivateKey, NULL);
ret = (*pScreen->CloseScreen) (index, pScreen);
@@ -129,6 +131,25 @@ compChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
return ret;
}
+static void
+compGetImage (DrawablePtr pDrawable,
+ int sx, int sy,
+ int w, int h,
+ unsigned int format,
+ unsigned long planemask,
+ char *pdstLine)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ CompScreenPtr cs = GetCompScreen (pScreen);
+
+ pScreen->GetImage = cs->GetImage;
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ compScreenUpdate (pScreen);
+ (*pScreen->GetImage) (pDrawable, sx, sy, w, h, format, planemask, pdstLine);
+ cs->GetImage = pScreen->GetImage;
+ pScreen->GetImage = compGetImage;
+}
+
/*
* Add alternate visuals -- always expose an ARGB32 and RGB24 visual
*/
@@ -361,6 +382,9 @@ compScreenInit (ScreenPtr pScreen)
cs->CloseScreen = pScreen->CloseScreen;
pScreen->CloseScreen = compCloseScreen;
+ cs->GetImage = pScreen->GetImage;
+ pScreen->GetImage = compGetImage;
+
dixSetPrivate(&pScreen->devPrivates, CompScreenPrivateKey, cs);
RegisterRealChildHeadProc(CompositeRealChildHead);
diff --git a/composite/compint.h b/composite/compint.h
index 4b058e7c3..c188bf1c5 100644
--- a/composite/compint.h
+++ b/composite/compint.h
@@ -159,6 +159,7 @@ typedef struct _CompScreen {
Window overlayWid;
CompOverlayClientPtr pOverlayClients;
+ GetImageProcPtr GetImage;
} CompScreenRec, *CompScreenPtr;
extern DevPrivateKeyRec CompScreenPrivateKeyRec;
@@ -315,6 +316,9 @@ compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
void
compWindowUpdate (WindowPtr pWin);
+void
+compScreenUpdate (ScreenPtr pScreen);
+
WindowPtr
CompositeRealChildHead (WindowPtr pWin);