diff options
author | Keith Packard <keithp@neko.keithp.com> | 2007-01-29 23:01:37 -0800 |
---|---|---|
committer | Keith Packard <keithp@neko.keithp.com> | 2007-01-29 23:01:37 -0800 |
commit | f1b95fda6ca01ff10a06e8753f66eb123d603eed (patch) | |
tree | 92df089c05c954ad62655182eb6e69c95345d439 | |
parent | cd5fe7890d9b940b9d3e00043a6c81a10ae3db69 (diff) |
Add support for the DamagePost (XDamage 1.1) request.
This makes damageproto >= 1.1 a requirement to build.
(cherry picked from 0b73a7eb17fd848c6bdc6a65ba835aa2cbfc3cfd)
-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 6c0aa3ab6..a93968744 100644 --- a/configure.ac +++ b/configure.ac @@ -514,7 +514,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 renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]" +REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]" REQUIRED_LIBS="xfont xau fontenc" AM_CONDITIONAL(XV, [test "x$XV" = xyes]) diff --git a/damageext/damageext.c b/damageext/damageext.c index 225f9ecf0..62525f68a 100755 --- a/damageext/damageext.c +++ b/damageext/damageext.c @@ -275,10 +275,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])) @@ -289,6 +314,8 @@ int (*ProcDamageVector[XDamageNumberRequests])(ClientPtr) = { ProcDamageCreate, ProcDamageDestroy, ProcDamageSubtract, +/*************** Version 1.1 ****************/ + ProcDamagePost, }; @@ -357,12 +384,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 |