Ok, another try by following the property principle.  Comments are added
into the patch without repeating them in the commit message.  Feel free to
change them the way that works for you.

Ping

On Thu, Dec 17, 2009 at 5:25 PM, Peter Hutterer <[email protected]>wrote:

>
> principle looks good, but we can't do it that way.
> BadValue must be returned only during checkonly == TRUE so the check needs
> to be moved out. Likewise, a property handler must not modify any data
> unless checkonly is true.
>
> the reason for this is that you may have multiple property handler on a
> given property. the server first asks all of them whether the change is
> possible, then applies the change. If any handler returns BadValue during
> the checkonly phase, the property handler returns that to the client.
> it's a sort-of atomic approach, either all prop handlers succeed or none of
> them.
>
> also, by removing the if (values[0] >= values[2]) check, we lose the
> ability to reset the area to the defaults (xsetwacom set xydefaults), that
> should be kept in there as behaviour.
>
> I think this patch should work though if you just backup priv->toolarea,
> change it, and then set it back to the previous value after all the checks
> have passed or succeeded.
> or - even better - copy the arealist as a whole and check only on the copy.
> that way we don't modify the device during checkonly at all.
> the principle is definitely sound though.
>
> Cheers,
>  Peter
>
From 4147814f913be47c34481c1c993bb5c486d5f914 Mon Sep 17 00:00:00 2001
From: Ping Cheng <[email protected]>
Date: Fri, 18 Dec 2009 16:12:25 -0800
Subject: [PATCH] Fix tablet area property check issue

Signed-off-by: Ping Cheng <[email protected]>
---
 src/wcmXCommand.c |   53 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/src/wcmXCommand.c b/src/wcmXCommand.c
index 563a42d..b8bbda9 100644
--- a/src/wcmXCommand.c
+++ b/src/wcmXCommand.c
@@ -306,46 +306,49 @@ int xf86WcmSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
     if (property == prop_tablet_area)
     {
         INT32 *values = (INT32*)prop->data;
-        WacomToolArea area;
+        WacomToolAreaPtr area = priv->toolarea;
+        WacomToolArea tmpArea;
 
         if (prop->size != 4 || prop->format != 32)
             return BadValue;
 
-        area.topX = values[0];
-        area.topY = values[1];
-        area.bottomX = values[2];
-        area.bottomY = values[3];
+        /* value validation is unnecessary since we let utility programs, such as
+         * xsetwacom and userland control panel take care of the validation role.
+         * when all four values are set to -1, it is an area reset (xydefault) */
+        if ((values[0] != -1) || (values[1] != -1) ||
+            (values[2] != -1) || (values[3] != -1))
+        {
+            tmpArea.topX = values[0];
+            tmpArea.topY = values[1];
+            tmpArea.bottomX = values[2];
+            tmpArea.bottomY = values[3];
 
-	/* FIXME: this will always be the case? */
-        if (WcmAreaListOverlap(&area, priv->tool->arealist))
-            return BadValue;
+            /* validate the area */
+            if (WcmAreaListOverlap(&tmpArea, priv->tool->arealist))
+                return BadValue;
+        }
 
         if (!checkonly)
         {
-            /* Invalid range resets axis to defaults */
-            if (values[0] >= values[2])
+            if ((values[0] == -1) && (values[1] == -1) &&
+                (values[2] == -1) && (values[3] == -1))
             {
                 values[0] = 0;
-		if (!IsTouch(priv))
+                values[1] = 0;
+                if (!IsTouch(priv))
 	            values[2] = common->wcmMaxX;
-		else
+                else
 	            values[2] = common->wcmMaxTouchX;
-            }
-
-            if (values[1] >= values[3])
-            {
-                values[1] = 0;
-		if (!IsTouch(priv))
+                if (!IsTouch(priv))
 	            values[3] = common->wcmMaxY;
-		else
+                else
 	            values[3] = common->wcmMaxTouchY;
             }
 
-            priv->topX = values[0];
-            priv->topY = values[1];
-            priv->bottomX = values[2];
-            priv->bottomY = values[3];
-            xf86WcmMappingFactor(local);
+            priv->topX = area->topX = values[0];
+            priv->topY = area->topY = values[1];
+            priv->bottomX = area->bottomX = values[2];
+            priv->bottomY = area->bottomY = values[3];
             xf86WcmInitialCoordinates(local, 0);
             xf86WcmInitialCoordinates(local, 1);
         }
-- 
1.6.5.2

------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to