[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