[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