[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, &param);
     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