Signed-off-by: Rami Ylimäki <[email protected]>
---
 Xext/xres.c         |   16 +++++++++++++---
 composite/compext.c |   24 ++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/Xext/xres.c b/Xext/xres.c
index ae9735a..0d626e6 100644
--- a/Xext/xres.c
+++ b/Xext/xres.c
@@ -223,6 +223,13 @@ ResFindPicturePixmaps (pointer value, XID id, pointer 
cdata)
     ResFindResourcePixmaps(value, id, RT_PICTURE, cdata);
 }
 
+static RESTYPE RT_COMPOSITE_CLIENT_WINDOW = RT_NONE;
+static void
+ResFindCompositeClientWindowPixmaps (pointer value, XID id, pointer cdata)
+{
+    ResFindResourcePixmaps(value, id, RT_COMPOSITE_CLIENT_WINDOW, cdata);
+}
+
 static int
 ProcXResQueryClientPixmapBytes (ClientPtr client)
 {
@@ -266,9 +273,12 @@ ProcXResQueryClientPixmapBytes (ClientPtr client)
                                   ResFindPicturePixmaps,
                                   (pointer)(&bytes));
 
-#ifdef COMPOSITE
-    /* FIXME: include composite pixmaps too */
-#endif
+    /* Composite extension client window pixmaps. */
+    RT_COMPOSITE_CLIENT_WINDOW = LookupResourceType("CompositeClientWindow");
+    if (RT_COMPOSITE_CLIENT_WINDOW != RT_NONE)
+        FindClientResourcesByType(clients[clientID], 
RT_COMPOSITE_CLIENT_WINDOW,
+                                  ResFindCompositeClientWindowPixmaps,
+                                  (pointer)(&bytes));
 
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
diff --git a/composite/compext.c b/composite/compext.c
index 30d9dc2..676b9a5 100644
--- a/composite/compext.c
+++ b/composite/compext.c
@@ -508,6 +508,28 @@ SProcCompositeDispatch (ClientPtr client)
        return BadRequest;
 }
 
+/** @see GetDefaultBytes */
+static void
+GetCompositeClientWindowBytes(pointer value, XID id, ResourceSizePtr size)
+{
+    WindowPtr window = value;
+
+    /* Currently only pixmap bytes are reported to clients. */
+    size->resourceSize = 0;
+
+    /* Calculate pixmap reference sizes. */
+    size->pixmapRefSize = 0;
+    if (window->redirectDraw != RedirectDrawNone)
+    {
+        SizeType pixmapSizeFunc = GetResourceTypeSizeFunc(RT_PIXMAP);
+        ResourceSizeRec pixmapSize = { 0, 0 };
+        ScreenPtr screen = window->drawable.pScreen;
+        PixmapPtr pixmap = screen->GetWindowPixmap(window);
+        pixmapSizeFunc(pixmap, pixmap->drawable.id, &pixmapSize);
+        size->pixmapRefSize += pixmapSize.pixmapRefSize;
+    }
+}
+
 void
 CompositeExtensionInit (void)
 {
@@ -547,6 +569,8 @@ CompositeExtensionInit (void)
        (FreeCompositeClientWindow, "CompositeClientWindow");
     if (!CompositeClientWindowType)
        return;
+    SetResourceTypeSizeFunc(CompositeClientWindowType,
+                            GetCompositeClientWindowBytes);
 
     CompositeClientSubwindowsType = CreateNewResourceType
        (FreeCompositeClientSubwindows, "CompositeClientSubwindows");
-- 
1.6.3.3

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to