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
