From b851ca968b7cce6d1a6438c05d3d5c8832249704 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Thu, 3 Apr 2014 18:22:50 +0100 Subject: [PATCH] Add pScreen->NameWindowPixmap hook This hook allows drivers to be notified when a pixmap gains a new ID. (ABI break.) Signed-off-by: Daniel Stone Reviewed-by: Adam Jackson Signed-off-by: Keith Packard --- composite/compext.c | 13 ++++++++++++- include/scrnintstr.h | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/composite/compext.c b/composite/compext.c index a945f721f..cadedbd37 100644 --- a/composite/compext.c +++ b/composite/compext.c @@ -239,6 +239,7 @@ ProcCompositeNameWindowPixmap(ClientPtr client) WindowPtr pWin; CompWindowPtr cw; PixmapPtr pPixmap; + ScreenPtr pScreen; int rc; REQUEST(xCompositeNameWindowPixmapReq); @@ -246,6 +247,8 @@ ProcCompositeNameWindowPixmap(ClientPtr client) REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq); VERIFY_WINDOW(pWin, stuff->window, client, DixGetAttrAccess); + pScreen = pWin->drawable.pScreen; + if (!pWin->viewable) return BadMatch; @@ -255,7 +258,7 @@ ProcCompositeNameWindowPixmap(ClientPtr client) if (!cw) return BadMatch; - pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin); + pPixmap = (*pScreen->GetWindowPixmap) (pWin); if (!pPixmap) return BadMatch; @@ -270,6 +273,14 @@ ProcCompositeNameWindowPixmap(ClientPtr client) if (!AddResource(stuff->pixmap, RT_PIXMAP, (void *) pPixmap)) return BadAlloc; + if (pScreen->NameWindowPixmap) { + rc = pScreen->NameWindowPixmap(pWin, pPixmap, stuff->pixmap); + if (rc != Success) { + FreeResource(stuff->pixmap, RT_NONE); + return rc; + } + } + return Success; } diff --git a/include/scrnintstr.h b/include/scrnintstr.h index 5197c79f5..6acdadd7a 100644 --- a/include/scrnintstr.h +++ b/include/scrnintstr.h @@ -356,6 +356,8 @@ typedef Bool (*ReplaceScanoutPixmapProcPtr)(DrawablePtr, PixmapPtr, Bool); typedef WindowPtr (*XYToWindowProcPtr)(ScreenPtr pScreen, SpritePtr pSprite, int x, int y); +typedef int (*NameWindowPixmapProcPtr)(WindowPtr, PixmapPtr, CARD32); + typedef struct _Screen { int myNum; /* index of this instance in Screens[] */ ATOM id; @@ -466,6 +468,7 @@ typedef struct _Screen { SetWindowPixmapProcPtr SetWindowPixmap; GetScreenPixmapProcPtr GetScreenPixmap; SetScreenPixmapProcPtr SetScreenPixmap; + NameWindowPixmapProcPtr NameWindowPixmap; PixmapPtr pScratchPixmap; /* scratch pixmap "pool" */