On Wed, Mar 30, 2011 at 11:17 PM, Peter Hutterer
<peter.hutte...@who-t.net>wrote:

> >                       {
> > -                             temppriv = (WacomDevicePtr)
> device->private;
> > -                             tempcommon = temppriv->common;
> > -
> > -                             if ((tempcommon->tablet_id ==
> common->tablet_id) &&
> > -                                             IsTouch(temppriv) &&
> temppriv->oldProximity)
> > -                             {
> > -                                     /* Send soft prox-out for touch
> first */
> > -                                     wcmSoftOutEvent(device);
> > -                             }
> > +                             /* Send touch out so pen takes control */
> > +
> wcmSoftOutEvent(common->wcmPointerToTouch->pInfo);
> > +                             return;
> >                       }
> >               }
> > +             else if (IsTouch(priv) && common->wcmPenInProx)
> > +                     /* Ignore touch events when pen is in prox */
> > +                     return;
>
> we won't ever get to this condition, IsPen(priv) is always true in this
> block
>

Right, it should be outside of the if-statement.

>       }
> >
> >       if (IsPen(priv))
> > diff --git a/src/wcmConfig.c b/src/wcmConfig.c
> > index 6235d3c..21a124e 100644
> > --- a/src/wcmConfig.c
> > +++ b/src/wcmConfig.c
> > @@ -397,6 +397,45 @@ wcmInitModel(InputInfoPtr pInfo)
> >       return TRUE;
> >  }
> >
> > +/* Link the touch tool to the pen of the same device
>
> asciidoc /** please
>

Oh, I only remembered there is no need to specify pInfo and common. I forgot
this detail.

> + * so we can arbitrate the events.
> > + */
> > +static void wcmLinkTouchAndPen(InputInfoPtr pInfo)
> > +{
> > +     WacomDevicePtr priv = pInfo->private;
> > +     WacomCommonPtr common = priv->common;
> > +     InputInfoPtr device = xf86FirstLocalDevice();
> > +     WacomCommonPtr tmpcommon = NULL;
> > +     WacomDevicePtr tmppriv = NULL;
> > +
> > +     /* Lookup to find the associated pen and touch */
> > +     for (; device != NULL; device = device->next)
> > +     {
> > +             if (strstr(device->drv->driverName, "wacom"))
> > +             {
> > +                     tmppriv = (WacomDevicePtr) device->private;
> > +                     tmpcommon = tmppriv->common;
> > +
>
> I'm a big fan of using continues for simple conditions to skip. in this
> case, a
>                        if (tmppriv == priv)
>                            continue;
>
> rather than adding this to the next condition that deals with the actual
> comparison of the tools.
>

No problem. Will do.


> > +                     if ((tmpcommon->tablet_id == common->tablet_id) &&
> > +                                     tmppriv != priv)
> > +                     {
> > +                             if (IsTouch(tmppriv) && IsPen(priv))
> > +                             {
> > +                                     common->wcmPointerToTouch =
> tmppriv;
> > +                                     common->tablet_type |=
> WCM_PENTOUCH;
> > +                                     tmpcommon->tablet_type |=
> WCM_PENTOUCH;
> > +                             }
> > +                             else if (IsTouch(priv) && IsPen(tmppriv))
> > +                             {
> > +                                     tmpcommon->wcmPointerToTouch =
> priv;
> > +                                     common->tablet_type |=
> WCM_PENTOUCH;
> > +                                     tmpcommon->tablet_type |=
> WCM_PENTOUCH;
> > +                             }
>
>
> this can be simplified with the if/else if condition setting a tmp variable
> for the new priv assignment and then a shared block for the three actual
> assignments.
>

Not really. Although priv can be set to tmppriv, both common and tmpcommon
are needed which can not be used with one name. Plus, since it is a if/else
if, there would be cases outside of those statements that we should not
assign any values except continue.

> +                     }
> > +             }
> > +     }
> > +}
> > +
> >  /* wcmPreInit - called for each input devices with the driver set to
> >   * "wacom" */
> >  #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
> > @@ -518,6 +557,12 @@ static int wcmPreInit(InputDriverPtr drv,
> InputInfoPtr pInfo, int flags)
> >               pInfo->fd = -1;
> >       }
> >
> > +     /* only link them once per port. We need to try for both pen and
> touch
> > +      * since we do not know which tool (touch or pen) will be added
> first.
> > +      */
> > +     if (IsTouch(priv) || (IsPen(priv) && !common->wcmPointerToTouch))
> > +             wcmLinkTouchAndPen(pInfo);
> > +
> >       return Success;
> >
> >  SetupProc_fail:
> > diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h
> > index 43348fc..60d6426 100644
> > --- a/src/xf86WacomDefs.h
> > +++ b/src/xf86WacomDefs.h
> > @@ -173,6 +173,7 @@ struct _WacomModel
> >  #define WCM_TPC                      (0x00000200 | WCM_LCD) /* TabletPC
> (special
> >                                                         button handling,
> >                                                         always an LCD) */
> > +#define WCM_PENTOUCH         0x00000400 /* Tablet supports pen and touch
> */
> >  #define TabletHasFeature(common, feature) (((common)->tablet_type &
> (feature)) != 0)
> >
> >  #define ABSOLUTE_FLAG                0x00000100
> > @@ -421,6 +422,9 @@ struct _WacomCommonRec
> >       int fd;                      /* file descriptor to tablet */
> >       int fd_refs;                 /* number of references to fd; if =0,
> fd is invalid */
> >       unsigned long wcmKeys[NBITS(KEY_MAX)]; /* supported tool types for
> the device */
> > +     WacomDevicePtr wcmPointerToTouch; /* The pointer for pen to access
> the
> > +                                        touch tool of the same device id
> */
>
> the term pointer in X is so badly overloaded that I can't recommend using
> it. how about just "wcmTouchDevice"?
>
> keeping this pointer gives us a race condition similar to the hotplugging
> one we had a while ago. if the touch device is removed first and tablet
> still sends event, the new block in commonDispatchDevice may dereference
> the
> already deleted pointer.
> You need a matching wcmUnlinkTouchAndPen() called during DEVICE_OFF.
>

I will think about it a bit more and do some testing to be sure.

Thank you for the review. I'll make a v2 after I hear your reply about the
if/else if statement discussion.

Ping
------------------------------------------------------------------------------
Create and publish websites with WebMatrix
Use the most popular FREE web apps or write code yourself; 
WebMatrix provides all the features you need to develop and 
publish your website. http://p.sf.net/sfu/ms-webmatrix-sf
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to