summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@neko.keithp.com>2007-01-29 23:01:37 -0800
committerKeith Packard <keithp@neko.keithp.com>2007-01-29 23:01:37 -0800
commitf1b95fda6ca01ff10a06e8753f66eb123d603eed (patch)
tree92df089c05c954ad62655182eb6e69c95345d439
parentcd5fe7890d9b940b9d3e00043a6c81a10ae3db69 (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.ac2
-rwxr-xr-xdamageext/damageext.c44
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