diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rwxr-xr-x | damageext/damageext.c | 44 |
2 files changed, 44 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac index 278502be9..c4aafaa11 100644 --- a/configure.ac +++ b/configure.ac @@ -603,7 +603,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la' XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la' dnl Core modules for most extensions, et al. -REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4] [kbproto >= 1.0.3]" +REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4] [kbproto >= 1.0.3]" REQUIRED_LIBS="xfont xau fontenc" if test "x$DBUS" = xauto; then diff --git a/damageext/damageext.c b/damageext/damageext.c index 6083693a4..a90dfb823 100755 --- a/damageext/damageext.c +++ b/damageext/damageext.c @@ -279,10 +279,35 @@ ProcDamageSubtract (ClientPtr client) return (client->noClientException); } +static int +ProcDamagePost (ClientPtr client) +{ + REQUEST(xDamagePostReq); + DrawablePtr pDrawable; + RegionPtr pRegion; + int rc; + + REQUEST_SIZE_MATCH(xDamagePostReq); + VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess); + rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0, + DixReadAccess); + if (rc != Success) + return rc; + + /* The region is relative to the drawable origin, so translate it out to + * screen coordinates like damage expects. + */ + REGION_TRANSLATE(pScreen, pRegion, pDrawable->x, pDrawable->y); + DamageDamageRegion(pDrawable, pRegion); + REGION_TRANSLATE(pScreen, pRegion, -pDrawable->x, -pDrawable->y); + + return (client->noClientException); +} + /* Major version controls available requests */ static const int version_requests[] = { X_DamageQueryVersion, /* before client sends QueryVersion */ - X_DamageSubtract, /* Version 1 */ + X_DamagePost, /* Version 1 */ }; #define NUM_VERSION_REQUESTS (sizeof (version_requests) / sizeof (version_requests[0])) @@ -293,6 +318,8 @@ int (*ProcDamageVector[XDamageNumberRequests])(ClientPtr) = { ProcDamageCreate, ProcDamageDestroy, ProcDamageSubtract, +/*************** Version 1.1 ****************/ + ProcDamagePost, }; @@ -361,12 +388,27 @@ SProcDamageSubtract (ClientPtr client) return (*ProcDamageVector[stuff->damageReqType]) (client); } +static int +SProcDamagePost (ClientPtr client) +{ + register int n; + REQUEST(xDamagePostReq); + + swaps (&stuff->length, n); + REQUEST_SIZE_MATCH(xDamageSubtractReq); + swapl (&stuff->drawable, n); + swapl (&stuff->region, n); + return (*ProcDamageVector[stuff->damageReqType]) (client); +} + int (*SProcDamageVector[XDamageNumberRequests])(ClientPtr) = { /*************** Version 1 ******************/ SProcDamageQueryVersion, SProcDamageCreate, SProcDamageDestroy, SProcDamageSubtract, +/*************** Version 1.1 ****************/ + SProcDamagePost, }; static int |