On Tue, Jan 28, 2014 at 7:01 PM, Peter Hutterer <peter.hutte...@who-t.net>wrote:
> On Fri, Jan 24, 2014 at 05:23:47PM -0800, Ping Cheng wrote:
> > Tools defined for devices that support both pen and touch need
> > to access the touch tool for arbitration and touch switch state
> > updates. Initially searching for the touch tool and storing it
> > to common->wcmTouchDevice saves time later when we need to access it.
> >
> > TabletFeature is updated with WCM_PENTOUCH for devices that
> > support both pen and touch too.
> >
> > Reviewed-by: Aaron Armstrong Skomra <sko...@gmail.com>
> > Signed-off-by: Ping Chdeng <pi...@wacom.com>
> > ---
> > src/wcmConfig.c | 101
> +++++++++++++++++++++++++++++---------------------------
> > 1 file changed, 52 insertions(+), 49 deletions(-)
> >
> > diff --git a/src/wcmConfig.c b/src/wcmConfig.c
> > index 2d19944..a6d4fdc 100644
> > --- a/src/wcmConfig.c
> > +++ b/src/wcmConfig.c
> > @@ -385,11 +385,17 @@ wcmInitModel(InputInfoPtr pInfo)
> > return TRUE;
> > }
> >
> > +
> > /**
> > - * Link the touch tool to the pen of the same device
> > - * so we can arbitrate the events when posting them.
> > + * Lookup to find the associated pen and touch for the same device.
> > + * Store touch tool in wcmTouchDevice for pen and touch, respectively,
> > + * of the same device. Update TabletFeature to indicate it is a hybrid
> > + * of touch and pen.
> > + *
> > + * @return True if found a touch tool for hybrid device.
> > + * false otherwise.
> > */
> > -static void wcmLinkTouchAndPen(InputInfoPtr pInfo)
> > +static Bool wcmPenAndTouch(InputInfoPtr pInfo, Bool different_id)
>
> Please document the "different_id" parameter as well, so it's obvious from
> the outset what it does. Maybe rename it to "allow_different_ids".
>
> > {
> > WacomDevicePtr priv = pInfo->private;
> > WacomCommonPtr common = priv->common;
> > @@ -397,65 +403,62 @@ static void wcmLinkTouchAndPen(InputInfoPtr pInfo)
> > WacomCommonPtr tmpcommon = NULL;
> > WacomDevicePtr tmppriv = NULL;
> >
> > - /* Lookup to find the associated pen and touch with same product
> id */
> > for (; device != NULL; device = device->next)
> > {
> > - if (!strcmp(device->drv->driverName, "wacom"))
> > - {
> > - tmppriv = (WacomDevicePtr) device->private;
> > - tmpcommon = tmppriv->common;
> > + if (strcmp(device->drv->driverName, "wacom"))
> > + continue;
> >
> > - /* skip the same tool or already linked devices */
> > - if ((tmppriv == priv) || tmpcommon->wcmTouchDevice)
> > - continue;
> > + tmppriv = (WacomDevicePtr) device->private;
> > + tmpcommon = tmppriv->common;
> >
> > - if (tmpcommon->tablet_id == common->tablet_id)
> > - {
> > - if (IsTouch(tmppriv) && IsTablet(priv))
> > - common->wcmTouchDevice = tmppriv;
> > - else if (IsTouch(priv) &&
> IsTablet(tmppriv))
> > - tmpcommon->wcmTouchDevice = priv;
> > -
> > - if (common->wcmTouchDevice ||
> > - tmpcommon->wcmTouchDevice)
> > - {
> > - TabletSetFeature(common,
> WCM_PENTOUCH);
> > - TabletSetFeature(tmpcommon,
> WCM_PENTOUCH);
> > - }
> > - }
> > + /* skip the same tool or already linked devices */
> > + if ((tmppriv == priv) ||
> > + (tmpcommon->wcmTouchDevice && IsTablet(tmppriv)))
> > + continue;
> >
> > - if (common->wcmTouchDevice)
> > - return;
> > - }
> > - }
> > -
> > - /* Lookup for pen and touch devices with different product ids */
> > - for (; device != NULL; device = device->next)
> > - {
> > - if (!strcmp(device->drv->driverName, "wacom"))
> > + if (((tmpcommon->tablet_id == common->tablet_id) &&
> !different_id)
> > + || different_id)
>
> if (((tmpcommon->tablet_id == common->tablet_id) || different_id)
>
> would be enough here for our purposes.
>
We both missed part of the logic. It should be:
if (((tmpcommon->tablet_id == common->tablet_id) && !different_id) ||
((tmpcommon->tablet_id != common->tablet_id) && different_id)
Otherwise, we run devices with (tmpcommon->tablet_id == common->tablet_id)
again when different_id is TRUE.
Will update the set soon.
Ping
>
>
> > {
> > - tmppriv = (WacomDevicePtr) device->private;
> > - tmpcommon = tmppriv->common;
> > -
> > - /* skip the same tool or already linked devices */
> > - if ((tmppriv == priv) || tmpcommon->wcmTouchDevice)
> > - continue;
> > -
> > - if (IsTouch(tmppriv) && IsTablet(priv))
> > + if (IsTouch(tmppriv))
> > + {
> > common->wcmTouchDevice = tmppriv;
> > - else if (IsTouch(priv) && IsTablet(tmppriv))
> > + tmpcommon->wcmTouchDevice = tmppriv;
> > + } else if (IsTouch(priv))
> > + {
> > tmpcommon->wcmTouchDevice = priv;
> > + common->wcmTouchDevice = priv;
> > + }
> >
> > - if (common->wcmTouchDevice ||
> tmpcommon->wcmTouchDevice)
> > + if ((common->wcmTouchDevice && IsTablet(priv)) ||
> > + (tmpcommon->wcmTouchDevice &&
> IsTablet(tmppriv)))
>
> NAK to this. Please split this patch into the cleanup patch and a separate
> patch where the actual changes are made. Burying minor changes like this
> inside a cleanup patch is a bad idea, it makes it really hard to find what
> goes wrong in the future (or even figure out what's different).
>
> What I see here is that there are some checks for IsTablet removed and
> others added, but it's not clear if that's a need for this patch or
> something else.
>
> > {
> > TabletSetFeature(common, WCM_PENTOUCH);
> > TabletSetFeature(tmpcommon, WCM_PENTOUCH);
> > }
> > -
> > - if (common->wcmTouchDevice)
> > - return;
> > }
> > +
> > + if (common->wcmTouchDevice)
> > + return TRUE;
> > }
> > + return FALSE;
> > +}
> > +
> > +/**
> > + * Update festures for tablets that support both pen and touch.
> > + * Pen and touch of the same device can have same product id,
> > + * such as Intuos and most Cintiq series; or different product
> > + * ids, such as Cintiq 24HD. We look for pen and touch with same
> > + * product id first. If we do not find a touch tool, devices
> > + * with different product ids will be searched.
> > + */
> > +static void wcmUpdatePenAndTouchInfo(InputInfoPtr pInfo)
> > +{
> > + /* pen and touch with same product id */
> > + if (wcmPenAndTouch(pInfo, FALSE))
> > + return;
> > + else
> > + /* pen and touch devices with different product ids */
> > + wcmPenAndTouch(pInfo, TRUE);
>
> why not the folowing?
>
> > + if (!wcmPenAndTouch(pInfo, FALSE))
> > + wcmPenAndTouch(pInfo, TRUE); /* pen and touch devices with
> different product ids */
>
>
> Cheers,
> Peter
>
> > }
> >
> > /**
> > @@ -606,11 +609,11 @@ static int wcmPreInit(InputDriverPtr drv,
> InputInfoPtr pInfo, int flags)
> > pInfo->fd = -1;
> > }
> >
> > - /* only link them once per port. We need to try for both tablet
> tool
> > + /* only update once per port. We need to try for both tablet tool
> > * and touch since we do not know which tool will be added first.
> > */
> > if (IsTouch(priv) || (IsTablet(priv) && !common->wcmTouchDevice))
> > - wcmLinkTouchAndPen(pInfo);
> > + wcmUpdatePenAndTouchInfo(pInfo);
> >
> > free(type);
> > free(oldname);
> > --
> > 1.8.3.2
> >
>
------------------------------------------------------------------------------
WatchGuard Dimension instantly turns raw network data into actionable
security intelligence. It gives you real-time visual feedback on key
security issues and trends. Skip the complicated setup - simply import
a virtual appliance and go from zero to informed in seconds.
http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel