[PATCH] Added processing of confine protocol.
Philipp Reh
sefi at s-e-f-i.de
Thu May 5 07:26:19 PDT 2011
---
Xi/extinit.c | 8 ++-
Xi/xigrabdev.c | 101 +++++++++++++++++++++++++++++--------
Xi/xigrabdev.h | 3 +
Xi/xipassivegrab.c | 139 +++++++++++++++++++++++++++++++++++++++-------------
Xi/xipassivegrab.h | 2 +
5 files changed, 194 insertions(+), 59 deletions(-)
diff --git a/Xi/extinit.c b/Xi/extinit.c
index 51e0078..4a6f4cc 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -259,7 +259,9 @@ static int (*ProcIVector[])(ClientPtr) = {
ProcXIChangeProperty, /* 57 */
ProcXIDeleteProperty, /* 58 */
ProcXIGetProperty, /* 59 */
- ProcXIGetSelectedEvents /* 60 */
+ ProcXIGetSelectedEvents, /* 60 */
+ ProcXIGrabDeviceWithConfine, /* 61 */
+ ProcXIPassiveGrabDeviceWithConfine /* 62 */
};
/* For swapped clients */
@@ -324,7 +326,9 @@ static int (*SProcIVector[])(ClientPtr) = {
SProcXIChangeProperty, /* 57 */
SProcXIDeleteProperty, /* 58 */
SProcXIGetProperty, /* 59 */
- SProcXIGetSelectedEvents /* 60 */
+ SProcXIGetSelectedEvents, /* 60 */
+ SProcXIGrabDeviceWithConfine, /* 61 */
+ SProcXIPassiveGrabDeviceWithConfine /* 62 */
};
/*****************************************************************
diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c
index 0adc878..25b19aa 100644
--- a/Xi/xigrabdev.c
+++ b/Xi/xigrabdev.c
@@ -42,25 +42,25 @@
#include "exevents.h"
#include "xigrabdev.h"
-int
-SProcXIGrabDevice(ClientPtr client)
+static void
+XIConvertGrabDeviceReq(xXIGrabDeviceWithConfineReq *result, xXIGrabDeviceReq *source)
{
- char n;
-
- REQUEST(xXIGrabDeviceReq);
-
- swaps(&stuff->length, n);
- swaps(&stuff->deviceid, n);
- swapl(&stuff->grab_window, n);
- swapl(&stuff->cursor, n);
- swapl(&stuff->time, n);
- swaps(&stuff->mask_len, n);
-
- return ProcXIGrabDevice(client);
+ result->reqType = X_XIGrabDeviceWithConfine;
+ result->length = source->length + 1; /* length is always in 4 bytes, + 1 for confine_to field */
+ result->grab_window = source->grab_window;
+ result->confine_to = None;
+ result->time = source->time;
+ result->cursor = source->cursor;
+ result->deviceid = source->deviceid;
+ result->grab_mode = source->grab_mode;
+ result->paired_device_mode = source->paired_device_mode;
+ result->owner_events = source->owner_events;
+ /*result->pad*/
+ result->mask_len = source->mask_len;
}
-int
-ProcXIGrabDevice(ClientPtr client)
+static int
+XIGrabDeviceImpl(ClientPtr client, xXIGrabDeviceWithConfineReq *stuff, unsigned char *extra)
{
DeviceIntPtr dev;
xXIGrabDeviceReply rep;
@@ -69,9 +69,6 @@ ProcXIGrabDevice(ClientPtr client)
GrabMask mask;
int mask_len;
- REQUEST(xXIGrabDeviceReq);
- REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
-
ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess);
if (ret != Success)
return ret;
@@ -79,13 +76,13 @@ ProcXIGrabDevice(ClientPtr client)
if (!IsMaster(dev))
stuff->paired_device_mode = GrabModeAsync;
- if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
+ if (XICheckInvalidMaskBits(client, extra,
stuff->mask_len * 4) != Success)
return BadValue;
mask_len = min(sizeof(mask.xi2mask[stuff->deviceid]), stuff->mask_len * 4);
memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
- memcpy(mask.xi2mask, (char*)&stuff[1], mask_len);
+ memcpy(mask.xi2mask, extra, mask_len);
ret = GrabDevice(client, dev, stuff->grab_mode,
stuff->paired_device_mode,
@@ -95,7 +92,7 @@ ProcXIGrabDevice(ClientPtr client)
&mask,
GRABTYPE_XI2,
stuff->cursor,
- None /* confineTo */,
+ stuff->confine_to,
&status);
if (ret != Success)
@@ -112,6 +109,66 @@ ProcXIGrabDevice(ClientPtr client)
return ret;
}
+static int
+SXIGrabDeviceImpl(ClientPtr client, xXIGrabDeviceWithConfineReq *stuff, unsigned char *extra)
+{
+ char n;
+
+ swaps(&stuff->length, n);
+ swaps(&stuff->deviceid, n);
+ swapl(&stuff->grab_window, n);
+ swapl(&stuff->confine_to, n);
+ swapl(&stuff->cursor, n);
+ swapl(&stuff->time, n);
+ swaps(&stuff->mask_len, n);
+
+ return XIGrabDeviceImpl(client, stuff, extra);
+}
+
+int
+SProcXIGrabDevice(ClientPtr client)
+{
+ xXIGrabDeviceWithConfineReq new_stuff;
+
+ REQUEST(xXIGrabDeviceReq);
+ REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
+
+ XIConvertGrabDeviceReq(&new_stuff, stuff);
+
+ return SXIGrabDeviceImpl(client, &new_stuff, (unsigned char*)&stuff[1]);
+}
+
+int
+ProcXIGrabDevice(ClientPtr client)
+{
+ xXIGrabDeviceWithConfineReq new_stuff;
+
+ REQUEST(xXIGrabDeviceReq);
+ REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq);
+
+ XIConvertGrabDeviceReq(&new_stuff, stuff);
+
+ return XIGrabDeviceImpl(client, &new_stuff, (unsigned char*)&stuff[1]);
+}
+
+int
+SProcXIGrabDeviceWithConfine(ClientPtr client)
+{
+ REQUEST(xXIGrabDeviceWithConfineReq);
+ REQUEST_AT_LEAST_SIZE(xXIGrabDeviceWithConfineReq);
+
+ return SXIGrabDeviceImpl(client, stuff, (unsigned char*)&stuff[1]);
+}
+
+int
+ProcXIGrabDeviceWithConfine(ClientPtr client)
+{
+ REQUEST(xXIGrabDeviceWithConfineReq);
+ REQUEST_AT_LEAST_SIZE(xXIGrabDeviceWithConfineReq);
+
+ return XIGrabDeviceImpl(client, stuff, (unsigned char*)&stuff[1]);
+}
+
int
SProcXIUngrabDevice(ClientPtr client)
{
diff --git a/Xi/xigrabdev.h b/Xi/xigrabdev.h
index 08309c9..b951786 100644
--- a/Xi/xigrabdev.h
+++ b/Xi/xigrabdev.h
@@ -33,6 +33,9 @@
int ProcXIGrabDevice(ClientPtr client);
int SProcXIGrabDevice(ClientPtr client);
+int ProcXIGrabDeviceWithConfine(ClientPtr client);
+int SProcXIGrabDeviceWithConfine(ClientPtr client);
+
int ProcXIUngrabDevice(ClientPtr client);
int SProcXIUngrabDevice(ClientPtr client);
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
index ae43433..c3b9910 100644
--- a/Xi/xipassivegrab.c
+++ b/Xi/xipassivegrab.c
@@ -45,38 +45,29 @@
#include "dixgrabs.h"
#include "misc.h"
-int
-SProcXIPassiveGrabDevice(ClientPtr client)
-{
- int i;
- char n;
- xXIModifierInfo *mods;
-
- REQUEST(xXIPassiveGrabDeviceReq);
-
- swaps(&stuff->length, n);
- swaps(&stuff->deviceid, n);
- swapl(&stuff->grab_window, n);
- swapl(&stuff->cursor, n);
- swapl(&stuff->time, n);
- swapl(&stuff->detail, n);
- swaps(&stuff->mask_len, n);
- swaps(&stuff->num_modifiers, n);
-
- mods = (xXIModifierInfo*)&stuff[1];
-
- for (i = 0; i < stuff->num_modifiers; i++, mods++)
- {
- swapl(&mods->base_mods, n);
- swapl(&mods->latched_mods, n);
- swapl(&mods->locked_mods, n);
- }
- return ProcXIPassiveGrabDevice(client);
+static void
+XIConvertPassiveGrabDeviceReq(xXIPassiveGrabDeviceWithConfineReq *result, xXIPassiveGrabDeviceReq *source)
+{
+ result->reqType = X_XIPassiveGrabDeviceWithConfine;
+ result->length = source->length + 1; /* length is always in 4 bytes, + 1 for confine_to field */
+ result->time = source->time;
+ result->grab_window = source->grab_window;
+ result->confine_to = None;
+ result->cursor = source->cursor;
+ result->detail = source->detail;
+ result->deviceid = source->deviceid;
+ result->num_modifiers = source->num_modifiers;
+ result->mask_len = source->mask_len;
+ result->grab_type = source->grab_type;
+ result->grab_mode = source->grab_mode;
+ result->paired_device_mode = source->paired_device_mode;
+ result->owner_events = source->owner_events;
+ /*result->pad*/
}
-int
-ProcXIPassiveGrabDevice(ClientPtr client)
+static int
+XIPassiveGrabDeviceImpl(ClientPtr client, xXIPassiveGrabDeviceWithConfineReq *stuff, unsigned char *extra)
{
DeviceIntPtr dev, mod_dev;
xXIPassiveGrabDeviceReply rep;
@@ -90,9 +81,6 @@ ProcXIPassiveGrabDevice(ClientPtr client)
int mask_len;
int n;
- REQUEST(xXIPassiveGrabDeviceReq);
- REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
-
if (stuff->deviceid == XIAllDevices)
dev = inputInfo.all_devices;
else if (stuff->deviceid == XIAllMasterDevices)
@@ -123,13 +111,13 @@ ProcXIPassiveGrabDevice(ClientPtr client)
return BadValue;
}
- if (XICheckInvalidMaskBits(client, (unsigned char*)&stuff[1],
+ if (XICheckInvalidMaskBits(client, extra,
stuff->mask_len * 4) != Success)
return BadValue;
mask_len = min(sizeof(mask.xi2mask[stuff->deviceid]), stuff->mask_len * 4);
memset(mask.xi2mask, 0, sizeof(mask.xi2mask));
- memcpy(mask.xi2mask[stuff->deviceid], &stuff[1], mask_len * 4);
+ memcpy(mask.xi2mask[stuff->deviceid], extra, mask_len * 4);
rep.repType = X_Reply;
rep.RepType = X_XIPassiveGrabDevice;
@@ -143,6 +131,7 @@ ProcXIPassiveGrabDevice(ClientPtr client)
param.this_device_mode = stuff->grab_mode;
param.other_devices_mode = stuff->paired_device_mode;
param.grabWindow = stuff->grab_window;
+ param.confineTo = stuff->confine_to;
param.cursor = stuff->cursor;
if (stuff->cursor != None)
@@ -160,11 +149,18 @@ ProcXIPassiveGrabDevice(ClientPtr client)
if (status != Success)
return status;
+ if (stuff->confine_to != None)
+ {
+ status = dixLookupWindow((WindowPtr*)&tmp, stuff->confine_to, client, DixSetAttrAccess);
+ if (status != Success)
+ return status;
+ }
+
status = CheckGrabValues(client, ¶m);
if (status != Success)
return status;
- modifiers = (uint32_t*)&stuff[1] + stuff->mask_len;
+ modifiers = (uint32_t*)extra + stuff->mask_len;
modifiers_failed = calloc(stuff->num_modifiers, sizeof(xXIGrabModifierInfo));
if (!modifiers_failed)
return BadAlloc;
@@ -213,6 +209,79 @@ ProcXIPassiveGrabDevice(ClientPtr client)
return ret;
}
+static int
+SXIPassiveGrabDeviceImpl(ClientPtr client, xXIPassiveGrabDeviceWithConfineReq *stuff, unsigned char *extra)
+{
+ int i;
+ char n;
+ xXIModifierInfo *mods;
+
+ swaps(&stuff->length, n);
+ swaps(&stuff->deviceid, n);
+ swapl(&stuff->grab_window, n);
+ swapl(&stuff->confine_to, n);
+ swapl(&stuff->cursor, n);
+ swapl(&stuff->time, n);
+ swapl(&stuff->detail, n);
+ swaps(&stuff->mask_len, n);
+ swaps(&stuff->num_modifiers, n);
+
+ mods = (xXIModifierInfo*)extra;
+
+ for (i = 0; i < stuff->num_modifiers; i++, mods++)
+ {
+ swapl(&mods->base_mods, n);
+ swapl(&mods->latched_mods, n);
+ swapl(&mods->locked_mods, n);
+ }
+
+ return XIPassiveGrabDeviceImpl(client, stuff, extra);
+}
+
+int
+ProcXIPassiveGrabDevice(ClientPtr client)
+{
+ xXIPassiveGrabDeviceWithConfineReq new_stuff;
+
+ REQUEST(xXIPassiveGrabDeviceReq);
+ REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
+
+ XIConvertPassiveGrabDeviceReq(&new_stuff, stuff);
+
+ return XIPassiveGrabDeviceImpl(client, &new_stuff, (unsigned char *)&stuff[1]);
+}
+
+int
+SProcXIPassiveGrabDevice(ClientPtr client)
+{
+ xXIPassiveGrabDeviceWithConfineReq new_stuff;
+
+ REQUEST(xXIPassiveGrabDeviceReq);
+ REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq);
+
+ XIConvertPassiveGrabDeviceReq(&new_stuff, stuff);
+
+ return SXIPassiveGrabDeviceImpl(client, &new_stuff, (unsigned char *)&stuff[1]);
+}
+
+int
+ProcXIPassiveGrabDeviceWithConfine(ClientPtr client)
+{
+ REQUEST(xXIPassiveGrabDeviceWithConfineReq);
+ REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceWithConfineReq);
+
+ return XIPassiveGrabDeviceImpl(client, stuff, (unsigned char *)&stuff[1]);
+}
+
+int
+SProcXIPassiveGrabDeviceWithConfine(ClientPtr client)
+{
+ REQUEST(xXIPassiveGrabDeviceWithConfineReq);
+ REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceWithConfineReq);
+
+ return SXIPassiveGrabDeviceImpl(client, stuff, (unsigned char *)&stuff[1]);
+}
+
void
SRepXIPassiveGrabDevice(ClientPtr client, int size,
xXIPassiveGrabDeviceReply * rep)
diff --git a/Xi/xipassivegrab.h b/Xi/xipassivegrab.h
index 079e7c6..a60f5c8 100644
--- a/Xi/xipassivegrab.h
+++ b/Xi/xipassivegrab.h
@@ -35,5 +35,7 @@ int ProcXIPassiveUngrabDevice(ClientPtr client);
void SRepXIPassiveGrabDevice(ClientPtr client, int size, xXIPassiveGrabDeviceReply * rep);
int ProcXIPassiveGrabDevice(ClientPtr client);
int SProcXIPassiveGrabDevice(ClientPtr client);
+int ProcXIPassiveGrabDeviceWithConfine(ClientPtr client);
+int SProcXIPassiveGrabDeviceWithConfine(ClientPtr client);
#endif /* XIPASSIVEGRAB_H */
--
1.7.5.rc3
More information about the xorg-devel
mailing list