[PATCH 3/3] Xi: ask handlers before deletion of property.
Peter Hutterer
peter.hutterer at who-t.net
Mon Sep 22 01:38:38 PDT 2008
From: Peter Hutterer <peter.hutterer at redhat.com>
Add "delete" parameter to SetProperty handler, handlers can refuse to delete a
property by returning something other than Success.
---
Xi/xiproperty.c | 20 ++++++++++++++++++--
dix/devices.c | 6 +++++-
include/exevents.h | 3 ++-
include/inputstr.h | 3 ++-
4 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c
index bd130d1..50a4caf 100644
--- a/Xi/xiproperty.c
+++ b/Xi/xiproperty.c
@@ -96,7 +96,8 @@ long
XIRegisterPropertyHandler(DeviceIntPtr dev,
int (*SetProperty) (DeviceIntPtr dev,
Atom property,
- XIPropertyValuePtr prop),
+ XIPropertyValuePtr prop,
+ BOOL delete),
int (*GetProperty) (DeviceIntPtr dev,
Atom property))
{
@@ -218,11 +219,26 @@ XIDeleteDeviceProperty (DeviceIntPtr device, Atom property, Bool fromClient)
{
XIPropertyPtr prop, *prev;
devicePropertyNotify event;
+ int rc;
for (prev = &device->properties.properties; (prop = *prev); prev = &(prop->next))
if (prop->propertyName == property)
break;
+ /* Ask handlers if we may delete the property */
+ if (fromClient && device->properties.handlers)
+ {
+ XIPropertyHandlerPtr handler = device->properties.handlers;
+ while(handler)
+ {
+ rc = handler->SetProperty(device, prop->propertyName,
+ &prop->value, TRUE);
+ if (rc != Success)
+ return (rc);
+ handler = handler->next;
+ }
+ }
+
if (prop)
{
*prev = prop->next;
@@ -329,7 +345,7 @@ XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type,
if (handler->SetProperty)
{
rc = handler->SetProperty(dev, prop->propertyName,
- &new_value);
+ &new_value, FALSE);
if (rc != Success)
{
if (new_value.data)
diff --git a/dix/devices.c b/dix/devices.c
index fb63473..c0ff019 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -102,10 +102,14 @@ DevPrivateKey UnusedClassesPrivateKey = &UnusedClassesPrivateKeyIndex;
* DIX property handler.
*/
static int
-DeviceSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop)
+DeviceSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
+ BOOL delete)
{
if (property == XIGetKnownProperty(XI_PROP_ENABLED))
{
+ if (delete) /* you're not allowed to delete any server-internal prop */
+ return BadAccess;
+
if (prop->format != 8 || prop->type != XA_INTEGER || prop->size != 1)
return BadValue;
diff --git a/include/exevents.h b/include/exevents.h
index c3a2ad6..b22d433 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -226,7 +226,8 @@ extern long XIRegisterPropertyHandler(
DeviceIntPtr dev,
int (*SetProperty) (DeviceIntPtr dev,
Atom property,
- XIPropertyValuePtr prop),
+ XIPropertyValuePtr prop,
+ BOOL delete),
int (*GetProperty) (DeviceIntPtr dev,
Atom property)
);
diff --git a/include/inputstr.h b/include/inputstr.h
index 93b3293..0a8bf91 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -366,7 +366,8 @@ typedef struct _XIPropertyHandler
long id;
int (*SetProperty) (DeviceIntPtr dev,
Atom property,
- XIPropertyValuePtr prop);
+ XIPropertyValuePtr prop,
+ BOOL delete);
int (*GetProperty) (DeviceIntPtr dev,
Atom property);
} XIPropertyHandler, *XIPropertyHandlerPtr;
--
1.5.4.3
More information about the xorg
mailing list