Xi: add "deletable" flag to properties, add DeleteProperty handler.

A property can only be deleted if any of the following is true:
- if a property is deletable and all handlers return Success.
- if a property is non-deleteable and the all handlers return Success AND the
  delete request does not come from a client (i.e. driver or the server).

A client can never delete a non-deletable property.
This commit is contained in:
Peter Hutterer 2008-09-18 18:21:03 +09:30
parent 22e9047268
commit a2d83b9dc8
4 changed files with 49 additions and 3 deletions

View File

@ -98,6 +98,8 @@ XIRegisterPropertyHandler(DeviceIntPtr dev,
Atom property, Atom property,
XIPropertyValuePtr prop), XIPropertyValuePtr prop),
int (*GetProperty) (DeviceIntPtr dev, int (*GetProperty) (DeviceIntPtr dev,
Atom property),
int (*DeleteProperty) (DeviceIntPtr dev,
Atom property)) Atom property))
{ {
XIPropertyHandlerPtr new_handler; XIPropertyHandlerPtr new_handler;
@ -109,6 +111,7 @@ XIRegisterPropertyHandler(DeviceIntPtr dev,
new_handler->id = XIPropHandlerID++; new_handler->id = XIPropHandlerID++;
new_handler->SetProperty = SetProperty; new_handler->SetProperty = SetProperty;
new_handler->GetProperty = GetProperty; new_handler->GetProperty = GetProperty;
new_handler->DeleteProperty = DeleteProperty;
new_handler->next = dev->properties.handlers; new_handler->next = dev->properties.handlers;
dev->properties.handlers = new_handler; dev->properties.handlers = new_handler;
@ -153,6 +156,7 @@ XICreateDeviceProperty (Atom property)
prop->value.format = 0; prop->value.format = 0;
prop->value.size = 0; prop->value.size = 0;
prop->value.data = NULL; prop->value.data = NULL;
prop->deletable = TRUE;
return prop; return prop;
} }
@ -218,11 +222,29 @@ XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient)
{ {
XIPropertyPtr prop, *prev; XIPropertyPtr prop, *prev;
devicePropertyNotify event; devicePropertyNotify event;
int rc = Success;
for (prev = &device->properties.properties; (prop = *prev); prev = &(prop->next)) for (prev = &device->properties.properties; (prop = *prev); prev = &(prop->next))
if (prop->propertyName == property) if (prop->propertyName == property)
break; break;
if (fromClient && !prop->deletable)
return BadAccess;
/* Ask handlers if we may delete the property */
if (device->properties.handlers)
{
XIPropertyHandlerPtr handler = device->properties.handlers;
while(handler)
{
if (handler->DeleteProperty)
rc = handler->DeleteProperty(device, prop->propertyName);
if (rc != Success)
return (rc);
handler = handler->next;
}
}
if (prop) if (prop)
{ {
*prev = prop->next; *prev = prop->next;
@ -402,6 +424,18 @@ XIGetDeviceProperty (DeviceIntPtr dev, Atom property, XIPropertyValuePtr *value)
return Success; return Success;
} }
int
XISetDevicePropertyDeletable(DeviceIntPtr dev, Atom property, Bool deletable)
{
XIPropertyPtr prop = XIFetchDeviceProperty(dev, property);
if (!prop)
return BadAtom;
prop->deletable = deletable;
return Success;
}
int int
ProcXListDeviceProperties (ClientPtr client) ProcXListDeviceProperties (ClientPtr client)
{ {

View File

@ -223,7 +223,8 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED), XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
XA_INTEGER, 8, PropModeReplace, 1, &dev->enabled, XA_INTEGER, 8, PropModeReplace, 1, &dev->enabled,
FALSE); FALSE);
XIRegisterPropertyHandler(dev, DeviceSetProperty, NULL); XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_ENABLED), FALSE);
XIRegisterPropertyHandler(dev, DeviceSetProperty, NULL, NULL);
return dev; return dev;
} }

View File

@ -222,12 +222,20 @@ extern int XIGetDeviceProperty(
XIPropertyValuePtr* /* value */ XIPropertyValuePtr* /* value */
); );
extern int XISetDevicePropertyDeletable(
DeviceIntPtr /* dev */,
Atom /* property */,
Bool /* deletable */
);
extern long XIRegisterPropertyHandler( extern long XIRegisterPropertyHandler(
DeviceIntPtr dev, DeviceIntPtr dev,
int (*SetProperty) (DeviceIntPtr dev, int (*SetProperty) (DeviceIntPtr dev,
Atom property, Atom property,
XIPropertyValuePtr prop), XIPropertyValuePtr prop),
int (*GetProperty) (DeviceIntPtr dev, int (*GetProperty) (DeviceIntPtr dev,
Atom property),
int (*DeleteProperty) (DeviceIntPtr dev,
Atom property) Atom property)
); );

View File

@ -353,6 +353,7 @@ typedef struct _XIProperty
{ {
struct _XIProperty *next; struct _XIProperty *next;
Atom propertyName; Atom propertyName;
BOOL deletable; /* clients can delete this prop? */
XIPropertyValueRec value; XIPropertyValueRec value;
} XIPropertyRec; } XIPropertyRec;
@ -369,6 +370,8 @@ typedef struct _XIPropertyHandler
XIPropertyValuePtr prop); XIPropertyValuePtr prop);
int (*GetProperty) (DeviceIntPtr dev, int (*GetProperty) (DeviceIntPtr dev,
Atom property); Atom property);
int (*DeleteProperty) (DeviceIntPtr dev,
Atom property);
} XIPropertyHandler, *XIPropertyHandlerPtr; } XIPropertyHandler, *XIPropertyHandlerPtr;
/* states for devices */ /* states for devices */