diff options
author | Rami Ylimäki <rami.ylimaki@vincit.fi> | 2010-10-27 17:25:50 +0300 |
---|---|---|
committer | Erkki Seppälä <erkki.seppala@vincit.fi> | 2012-04-18 12:31:27 +0300 |
commit | b8d0d19a6d410776b53a41e7cae90f68d4b22bb7 (patch) | |
tree | 182e325f2b569272f7e3479cd73621eec8b77966 | |
parent | e83388cc70e21e7f377ed2e417d04469e23eb706 (diff) |
composite: Report pixmap usage of client windows to resource extension.
Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
Signed-off-by: Rami Ylimäki <rami.ylimaki@vincit.fi>
Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net>
Reviewed-by: Tiago Vignatti <tiago.vignatti@nokia.com>
-rw-r--r-- | Xext/xres.c | 14 | ||||
-rw-r--r-- | composite/compext.c | 25 |
2 files changed, 38 insertions, 1 deletions
diff --git a/Xext/xres.c b/Xext/xres.c index a0734098c..b7933f251 100644 --- a/Xext/xres.c +++ b/Xext/xres.c @@ -28,6 +28,7 @@ #include "misc.h" #include <string.h> #include "picturestr.h" +#include "compint.h" /** @brief Holds fragments of responses for ConstructClientIds. * @@ -342,6 +343,14 @@ ResFindPicturePixmaps(pointer value, XID id, pointer cdata) #endif } +static void +ResFindCompositeClientWindowPixmaps (pointer value, XID id, pointer cdata) +{ +#ifdef COMPOSITE + ResFindResourcePixmaps(value, id, CompositeClientWindowType, cdata); +#endif +} + static int ProcXResQueryClientPixmapBytes(ClientPtr client) { @@ -384,7 +393,10 @@ ProcXResQueryClientPixmapBytes(ClientPtr client) #endif #ifdef COMPOSITE - /* FIXME: include composite pixmaps too */ + /* Composite extension client window pixmaps. */ + FindClientResourcesByType(clients[clientID], CompositeClientWindowType, + ResFindCompositeClientWindowPixmaps, + (pointer)(&bytes)); #endif rep.type = X_Reply; diff --git a/composite/compext.c b/composite/compext.c index 940eed1fc..1d4d8bf97 100644 --- a/composite/compext.c +++ b/composite/compext.c @@ -497,6 +497,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) { @@ -529,6 +551,9 @@ CompositeExtensionInit(void) if (!CompositeClientWindowType) return; + SetResourceTypeSizeFunc(CompositeClientWindowType, + GetCompositeClientWindowBytes); + CompositeClientSubwindowsType = CreateNewResourceType (FreeCompositeClientSubwindows, "CompositeClientSubwindows"); if (!CompositeClientSubwindowsType) |