From: Peter Hutterer <[EMAIL PROTECTED]> 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 _______________________________________________ xorg mailing list xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg