[PATCH 2/3] Xi: allow Set/GetProperties to return a status, and honour this status code.

Peter Hutterer peter.hutterer at who-t.net
Mon Sep 22 01:38:37 PDT 2008


From: Peter Hutterer <peter.hutterer at redhat.com>

If a property handler now bails out, return the error code to the caller. This
allows to be slightly more specific with the errors.
---
 Xi/xiproperty.c    |   63 +++++++++++++++++++++++++++++++++------------------
 dix/devices.c      |    7 ++---
 include/exevents.h |   16 ++++++------
 include/inputstr.h |   10 ++++----
 4 files changed, 57 insertions(+), 39 deletions(-)

diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index 425cd75..bd130d1 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -94,11 +94,11 @@ XIInitKnownProperties(void)
  */
 long
 XIRegisterPropertyHandler(DeviceIntPtr         dev,
-                          Bool (*SetProperty) (DeviceIntPtr dev,
-                                               Atom property,
-                                               XIPropertyValuePtr prop),
-                          Bool (*GetProperty) (DeviceIntPtr dev,
-                                               Atom property))
+                          int (*SetProperty) (DeviceIntPtr dev,
+                                              Atom property,
+                                              XIPropertyValuePtr prop),
+                          int (*GetProperty) (DeviceIntPtr dev,
+                                              Atom property))
 {
     XIPropertyHandlerPtr new_handler;
 
@@ -252,6 +252,7 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
     XIPropertyValuePtr          prop_value;
     XIPropertyValueRec          new_value;
     Bool                        add = FALSE;
+    int                         rc;
 
     size_in_bytes = format >> 3;
 
@@ -325,12 +326,16 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
             XIPropertyHandlerPtr handler = dev->properties.handlers;
             while(handler)
             {
-                if (handler->SetProperty &&
-                    !handler->SetProperty(dev, prop->propertyName, &new_value))
+                if (handler->SetProperty)
                 {
-                    if (new_value.data)
-                        xfree (new_value.data);
-                    return (BadValue);
+                    rc = handler->SetProperty(dev, prop->propertyName,
+                                              &new_value);
+                    if (rc != Success)
+                    {
+                        if (new_value.data)
+                            xfree (new_value.data);
+                        return (rc);
+                    }
                 }
                 handler = handler->next;
             }
@@ -349,7 +354,6 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
         dev->properties.properties = prop;
     }
 
-
     if (sendevent)
     {
         event.type      = DevicePropertyNotify;
@@ -363,16 +367,17 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
     return(Success);
 }
 
-/**
- *
- */
-_X_EXPORT XIPropertyValuePtr
-XIGetDeviceProperty (DeviceIntPtr dev, Atom property)
+int
+XIGetDeviceProperty (DeviceIntPtr dev, Atom property, XIPropertyValuePtr *value)
 {
     XIPropertyPtr   prop = XIFetchDeviceProperty (dev, property);
+    int rc;
 
     if (!prop)
-        return NULL;
+    {
+        *value = NULL;
+        return BadAtom;
+    }
 
     /* If we can, try to update the property value first */
     if (dev->properties.handlers)
@@ -381,11 +386,20 @@ XIGetDeviceProperty (DeviceIntPtr dev, Atom property)
         while(handler)
         {
             if (handler->GetProperty)
-                handler->GetProperty(dev, prop->propertyName);
+            {
+                rc = handler->GetProperty(dev, prop->propertyName);
+                if (rc != Success)
+                {
+                    *value = NULL;
+                    return rc;
+                }
+            }
             handler = handler->next;
         }
     }
-    return &prop->value;
+
+    *value = &prop->value;
+    return Success;
 }
 
 int
@@ -489,6 +503,8 @@ ProcXChangeDeviceProperty (ClientPtr client)
                                  stuff->type, (int)format,
                                  (int)mode, len, (pointer)&stuff[1], TRUE);
 
+    if (rc != Success)
+        client->errorValue = stuff->property;
     return rc;
 }
 
@@ -570,9 +586,12 @@ ProcXGetDeviceProperty (ClientPtr client)
         return(client->noClientException);
     }
 
-    prop_value = XIGetDeviceProperty(dev, stuff->property);
-    if (!prop_value)
-        return BadAtom;
+    rc = XIGetDeviceProperty(dev, stuff->property, &prop_value);
+    if (rc != Success)
+    {
+        client->errorValue = stuff->property;
+        return rc;
+    }
 
     /* If the request type and actual type don't match. Return the
     property information, but not the data. */
diff --git a/dix/devices.c b/dix/devices.c
index c0df6a2..fb63473 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -101,22 +101,21 @@ DevPrivateKey UnusedClassesPrivateKey = &UnusedClassesPrivateKeyIndex;
 /**
  * DIX property handler.
  */
-static Bool
+static int
 DeviceSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop)
 {
     if (property == XIGetKnownProperty(XI_PROP_ENABLED))
     {
         if (prop->format != 8 || prop->type != XA_INTEGER || prop->size != 1)
-            return FALSE;
+            return BadValue;
 
         if ((*((CARD8*)prop->data)) && !dev->enabled)
             EnableDevice(dev);
         else if (!(*((CARD8*)prop->data)) && dev->enabled)
             DisableDevice(dev);
-        return TRUE;
     }
 
-    return TRUE;
+    return Success;
 }
 
 
diff --git a/include/exevents.h b/include/exevents.h
index e137fef..c3a2ad6 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -216,19 +216,19 @@ extern int XIChangeDeviceProperty(
         Bool                    /* sendevent*/
         );
 
-extern XIPropertyValuePtr XIGetDeviceProperty(
+extern int XIGetDeviceProperty(
         DeviceIntPtr            /* dev */,
-        Atom                    /* property */
+        Atom                    /* property */,
+        XIPropertyValuePtr*     /* value */
 );
 
-
 extern long XIRegisterPropertyHandler(
         DeviceIntPtr         dev,
-        Bool (*SetProperty) (DeviceIntPtr dev,
-                             Atom property,
-                             XIPropertyValuePtr prop),
-        Bool (*GetProperty) (DeviceIntPtr dev,
-                             Atom property)
+        int (*SetProperty) (DeviceIntPtr dev,
+                            Atom property,
+                            XIPropertyValuePtr prop),
+        int (*GetProperty) (DeviceIntPtr dev,
+                            Atom property)
 );
 
 extern void XIUnRegisterPropertyHandler(
diff --git a/include/inputstr.h b/include/inputstr.h
index 64b6985..93b3293 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -364,11 +364,11 @@ typedef struct _XIPropertyHandler
 {
     struct _XIPropertyHandler* next;
     long id;
-    Bool (*SetProperty) (DeviceIntPtr dev,
-                         Atom property,
-                         XIPropertyValuePtr prop);
-    Bool (*GetProperty) (DeviceIntPtr dev,
-                         Atom property);
+    int (*SetProperty) (DeviceIntPtr dev,
+                        Atom property,
+                        XIPropertyValuePtr prop);
+    int (*GetProperty) (DeviceIntPtr dev,
+                        Atom property);
 } XIPropertyHandler, *XIPropertyHandlerPtr;
 
 /* states for devices */
-- 
1.5.4.3




More information about the xorg mailing list