On Wed, Mar 23, 2011 at 02:57:12PM -0700, Ping Cheng wrote:
> Serial ISDv4 kernel driver, wacom_w8001.ko, provides both pen and
> touch events on the same logical port. Filtering touch events when
> pen is in proximity while allowing pen events (ABS_X/Y, etc) pass.
> 
> Making this action configurable would make sense when XInput 2.1 is
> ready. At that point, we can post MT valuators while pen events are
> posted. Some code refactoring is needed to add a new channel to
> store the pen data as well as the 2FGT data.
> 
> Defering the code refactoring until we support XInput 2.1.
> 
> Signed-off-by: Ping Cheng <[email protected]>
> Reviewed-by: Peter Hutterer <[email protected]>
> Reviewed-by: Chris Bagwell <[email protected]>
> ---
> v4 changes: updated usbInitToolType and usbIsPenInProx interfaces.
> ---

merged, thank you.

Cheers,
  Peter


>  src/wcmUSB.c |  115 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
>  1 files changed, 109 insertions(+), 6 deletions(-)
> 
> diff --git a/src/wcmUSB.c b/src/wcmUSB.c
> index 17c3d87..197d9fc 100644
> --- a/src/wcmUSB.c
> +++ b/src/wcmUSB.c
> @@ -33,6 +33,8 @@
>  typedef struct {
>       int wcmLastToolSerial;
>       int wcmBTNChannel;
> +     int wcmDeviceType;
> +     Bool wcmPenTouch;
>       Bool wcmUseMT;
>       int wcmMTChannel;
>       int wcmPrevChannel;
> @@ -571,8 +573,14 @@ int usbWcmGetRanges(InputInfoPtr pInfo)
>               common->wcmMaxDist = absinfo.maximum;
>  
>       if (ISBITSET(abs, ABS_MT_SLOT))
> +     {
>               private->wcmUseMT = 1;
>  
> +             /* pen and MT on the same logical port */
> +             if (ISBITSET(common->wcmKeys, BTN_TOOL_PEN))
> +                     private->wcmPenTouch = TRUE;
> +     }
> +
>       /* A generic protocol device does not report ABS_MISC event */
>       if (!ISBITSET(abs, ABS_MISC))
>               common->wcmProtocolLevel = WCM_PROTOCOL_GENERIC;
> @@ -865,12 +873,29 @@ static int usbFilterEvent(WacomCommonPtr common, struct 
> input_event *event)
>               }
>               else if (event->type == EV_ABS)
>               {
> -                     switch(event->code)
> +                     if (private->wcmDeviceType == TOUCH_ID)
>                       {
> -                             case ABS_X:
> -                             case ABS_Y:
> -                             case ABS_PRESSURE:
> -                                     return 1;
> +                             /* filter ST for MT */
> +                             switch(event->code)
> +                             {
> +                                     case ABS_X:
> +                                     case ABS_Y:
> +                                     case ABS_PRESSURE:
> +                                             return 1;
> +                             }
> +                     }
> +                     else
> +                     {
> +                             /* filter MT for pen */
> +                             switch(event->code)
> +                             {
> +                                     case ABS_MT_SLOT:
> +                                     case ABS_MT_TRACKING_ID:
> +                                     case ABS_MT_POSITION_X:
> +                                     case ABS_MT_POSITION_Y:
> +                                     case ABS_MT_PRESSURE:
> +                                             return 1;
> +                             }
>                       }
>               }
>       }
> @@ -1304,6 +1329,64 @@ static int usbParseBTNEvent(WacomCommonPtr common,
>       return change;
>  }
>  
> +/***
> + * Retrieve the tool type from an USB data packet by looking at the event
> + * codes. Refer to linux/input.h for event codes that define tool types.
> + *
> + * @param event_ptr A pointer to the USB data packet that contains the
> + * events to be processed.
> + * @param nevents Number of events in the packet.
> + *
> + * @return The tool type. 0 if no pen/touch/eraser event code in the event.
> + */
> +static int usbInitToolType(const struct input_event *event_ptr, int nevents)
> +{
> +     int i, device_type = 0;
> +     struct input_event* event = (struct input_event *)event_ptr;
> +
> +     for (i = 0; (i < nevents) && !device_type; ++i)
> +     {
> +             switch (event->code)
> +             {
> +                     case BTN_TOOL_PEN:
> +                     case BTN_TOOL_PENCIL:
> +                     case BTN_TOOL_BRUSH:
> +                     case BTN_TOOL_AIRBRUSH:
> +                             device_type = STYLUS_ID;
> +                             break;
> +
> +                     case BTN_TOOL_FINGER:
> +                     case ABS_MT_SLOT:
> +                     case ABS_MT_TRACKING_ID:
> +                             device_type = TOUCH_ID;
> +                             break;
> +
> +                     case BTN_TOOL_RUBBER:
> +                             device_type = ERASER_ID;
> +                             break;
> +             }
> +
> +             event++;
> +     }
> +
> +     return device_type;
> +}
> +
> +/**
> + * Check if the tool is a stylus/eraser and in-prox or not.
> + *
> + * @param device_type The tool type stored in wcmChannel
> + * @param proximity The tool's proximity state
> +
> + * @return True if stylus/eraser is in-prox; False otherwise.
> + */
> +static Bool usbIsPenInProx(int device_type, int proximity)
> +{
> +     Bool is_pen = (device_type == STYLUS_ID) ||
> +                     (device_type == ERASER_ID);
> +     return (is_pen && proximity);
> +}
> +
>  static void usbDispatchEvents(InputInfoPtr pInfo)
>  {
>       int i;
> @@ -1313,11 +1396,31 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
>       WacomCommonPtr common = priv->common;
>       int channel;
>       int channel_change = 0, btn_channel_change = 0, mt_channel_change = 0;
> -     WacomDeviceState dslast;
> +     WacomDeviceState dslast = common->wcmChannel[0].valid.state;
>       wcmUSBData* private = common->private;
>  
>       DBG(6, common, "%d events received\n", private->wcmEventCnt);
>  
> +     if (private->wcmPenTouch)
> +     {
> +             private->wcmDeviceType = usbInitToolType(private->wcmEvents,
> +                                             private->wcmEventCnt);
> +
> +             /* We get both pen and touch data from the kernel when they
> +              * both are in/down. So, if we were (hence the need of dslast)
> +              * processing pen events, we should ignore touch events.
> +              *
> +              * MT events will be posted to the userland when XInput 2.1
> +              * is ready.
> +              */
> +             if ((private->wcmDeviceType == TOUCH_ID) &&
> +                             usbIsPenInProx(dslast.device_type, 
> dslast.proximity))
> +             {
> +                     private->wcmEventCnt = 0;
> +                     return;
> +             }
> +     }
> +
>       channel = usbChooseChannel(common);
>  
>       /* couldn't decide channel? invalid data */
> -- 
> 1.7.4
> 
> 
> ------------------------------------------------------------------------------
> Enable your software for Intel(R) Active Management Technology to meet the
> growing manageability and security demands of your customers. Businesses
> are taking advantage of Intel(R) vPro (TM) technology - will your software 
> be a part of the solution? Download the Intel(R) Manageability Checker 
> today! http://p.sf.net/sfu/intel-dev2devmar
> _______________________________________________
> Linuxwacom-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
> 

------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software 
be a part of the solution? Download the Intel(R) Manageability Checker 
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to