On Thu, Mar 3, 2011 at 4:56 PM, Peter Hutterer <[email protected]>wrote:

> Instead of returning rather ambiguous 0, 1 and 2, return enums with
> readable
> descriptions.
>
> No functional changes, other than that we now skip a few tests in
> wcmCheckSuppress if we already have the result.
>
> Signed-off-by: Peter Hutterer <[email protected]>
> ---
>  src/wcmCommon.c    |  101
> ++++++++++++++++++++++++++++++----------------------
>  src/xf86Wacom.h    |    6 +++
>  test/wacom-tests.c |   14 +++++++
>  3 files changed, 78 insertions(+), 43 deletions(-)
>
> diff --git a/src/wcmCommon.c b/src/wcmCommon.c
> index 0a5a8ac..16d850e 100644
> --- a/src/wcmCommon.c
> +++ b/src/wcmCommon.c
> @@ -53,8 +53,10 @@ static int *VCOPY(const int *valuators, int nvals)
>
>  ****************************************************************************/
>
>  static int applyPressureCurve(WacomDevicePtr pDev, const
> WacomDeviceStatePtr pState);
> -static void commonDispatchDevice(WacomCommonPtr common, unsigned int
> channel,
> -       const WacomChannelPtr pChannel, int suppress);
> +static void commonDispatchDevice(WacomCommonPtr common,
> +                                unsigned int channel,
> +                                const WacomChannelPtr pChannel,
> +                                enum WacomSuppressMode suppress);
>  static void sendAButton(InputInfoPtr pInfo, int button, int mask,
>                        int first_val, int num_vals, int *valuators);
>
> @@ -766,50 +768,65 @@ void wcmSendEvents(InputInfoPtr pInfo, const
> WacomDeviceState* ds)
>        }
>  }
>
>
> -/*****************************************************************************
> - * wcmCheckSuppress --
> - *  Determine whether device state has changed enough - return 0
> - *  if not.
> -
> ****************************************************************************/
> -
> -static int wcmCheckSuppress(WacomCommonPtr common,
> -                           const WacomDeviceState* dsOrig,
> -                           WacomDeviceState* dsNew)
> +/**
> + * Determine whether device state has changed enough to warrant further
> + * processing. The driver's "suppress" setting decides how much
> + * movement/state change must occur before we process events to avoid
> + * overloading the server with minimal changes (and getting fuzzy events).
> + * wcmCheckSuppress ensures that events meet this standard.
> + *
> + * @param dsOrig Previous device state
> + * @param dsNew Current device state
> + *
> + * @retval SUPPRESS_ALL Ignore this event completely.
> + * @retval SUPPRESS_NONE Process event normally.
> + * @retval SUPPRESS_NON_MOTION Suppress all data but motion data.
> + */
> +static enum WacomSuppressMode
> +wcmCheckSuppress(WacomCommonPtr common,
> +                const WacomDeviceState* dsOrig,
> +                WacomDeviceState* dsNew)
>  {
>        int suppress = common->wcmSuppress;
> -       /* NOTE: Suppression value of zero disables suppression. */
> -       int returnV = 0;
> +       enum WacomSuppressMode returnV = SUPPRESS_NONE;
>
>        /* Ignore all other changes that occur after initial out-of-prox. */
>        if (!dsNew->proximity && !dsOrig->proximity)
> -               return 0;
> +               return SUPPRESS_ALL;
>
>        /* Never ignore proximity changes. */
> -       if (dsOrig->proximity != dsNew->proximity) returnV = 1;
> -
> -       if (dsOrig->buttons != dsNew->buttons) returnV = 1;
> -       if (dsOrig->stripx != dsNew->stripx) returnV = 1;
> -       if (dsOrig->stripy != dsNew->stripy) returnV = 1;
> -       if (abs(dsOrig->tiltx - dsNew->tiltx) > suppress) returnV = 1;
> -       if (abs(dsOrig->tilty - dsNew->tilty) > suppress) returnV = 1;
> -       if (abs(dsOrig->pressure - dsNew->pressure) > suppress) returnV =
> 1;
> -       if (abs(dsOrig->capacity - dsNew->capacity) > suppress) returnV =
> 1;
> -       if (abs(dsOrig->throttle - dsNew->throttle) > suppress) returnV =
> 1;
> +       if (dsOrig->proximity != dsNew->proximity) goto out;
> +
> +       if (dsOrig->buttons != dsNew->buttons) goto out;
> +       if (dsOrig->stripx != dsNew->stripx) goto out;
> +       if (dsOrig->stripy != dsNew->stripy) goto out;
> +       if (abs(dsOrig->tiltx - dsNew->tiltx) > suppress) goto out;
> +       if (abs(dsOrig->tilty - dsNew->tilty) > suppress) goto out;
> +       if (abs(dsOrig->pressure - dsNew->pressure) > suppress) goto out;
> +       if (abs(dsOrig->capacity - dsNew->capacity) > suppress) goto out;
> +       if (abs(dsOrig->throttle - dsNew->throttle) > suppress) goto out;
>        if (abs(dsOrig->rotation - dsNew->rotation) > suppress &&
> -               (1800 - abs(dsOrig->rotation - dsNew->rotation)) >
>  suppress) returnV = 1;
> +           (1800 - abs(dsOrig->rotation - dsNew->rotation)) >  suppress)
> goto out;
>
>        /* look for change in absolute wheel position
>         * or any relative wheel movement
>         */
>        if ((abs(dsOrig->abswheel - dsNew->abswheel) > suppress)
> -               || (dsNew->relwheel != 0)) returnV = 1;
> +               || (dsNew->relwheel != 0))
> +               goto out;
>
> -       /* cursor moves or not? */
> +       returnV = SUPPRESS_ALL;
> +
> +out:
> +       /* Special handling for cursor: if nothing else changed but the
> +        * pointer x/y, suppress all but cursor movement. This return value
> +        * is used in commonDispatchDevice to short-cut event processing.
> +        */
>        if ((abs(dsOrig->x - dsNew->x) > suppress) ||
>                        (abs(dsOrig->y - dsNew->y) > suppress))
>        {
> -               if (!returnV) /* need to check if cursor moves or not */
> -                       returnV = 2;
> +               if (returnV == SUPPRESS_ALL)
> +                       returnV = SUPPRESS_NON_MOTION;
>        }
>        else /* don't move cursor */
>        {
> @@ -833,7 +850,7 @@ void wcmEvent(WacomCommonPtr common, unsigned int
> channel,
>        WacomDeviceState* pLast;
>        WacomDeviceState ds;
>        WacomChannelPtr pChannel;
> -       int suppress = 0;
> +       enum WacomSuppressMode suppress;
>        WacomDevicePtr priv = common->wcmDevices;
>        pChannel = common->wcmChannel + channel;
>        pLast = &pChannel->valid.state;
> @@ -895,12 +912,10 @@ void wcmEvent(WacomCommonPtr common, unsigned int
> channel,
>                common->wcmModel->FilterRaw(common,pChannel,&ds);
>        }
>
> -       /* Discard unwanted data */
> +       /* skip event if we don't have enough movement */
>

Maybe you want to add this info to the comments: Suppress is not aimed at
skipping the event due to no movement. The skipping part was a minor
feature. The main purpose was to discard small (x,y) movement (less than
wcmSuppress) to avoid jitter when user holding the tool on the tablet.


>        suppress = wcmCheckSuppress(common, pLast, &ds);
> -       if (!suppress)
> -       {
> +       if (suppress == SUPPRESS_ALL)
>                return;
> -       }
>
>        /* JEJ - Do not move this code without discussing it with me.
>         * The device state is invariant of any filtering performed below.
> @@ -1148,7 +1163,8 @@ setPressureButton(const WacomDevicePtr priv, const
> WacomDeviceState *ds)
>  }
>
>  static void commonDispatchDevice(WacomCommonPtr common, unsigned int
> channel,
> -                                const WacomChannelPtr pChannel, Bool
> suppress)
> +                                const WacomChannelPtr pChannel,
> +                                enum WacomSuppressMode suppress)
>  {
>        InputInfoPtr pInfo = NULL;
>        WacomToolPtr tool = NULL;
> @@ -1260,20 +1276,19 @@ static void commonDispatchDevice(WacomCommonPtr
> common, unsigned int channel,
>                deltx *= priv->factorX;
>                delty *= priv->factorY;
>
> +               /* less than one device coordinate movement? */
>

Sorry to bother you again. I am still trying to figure out how this check
works. I must have missed the concept. What is a device coordinate? Tool
(x,y), I guess. How do we get a less than one device coordinate movement?  I
thought it is the screen movement that we cares about, not the tool
movement. A device coordinate
change that causes a deltx/y >=1 may not lead to a cursor movement.

If the if-statement doesn't avoid discarding non-cursor movement events due
to the factor that we do not have enough information to make the decision
(lack of screen size/resolution, etc), removing this block of code might be
a better option.

I need to understand the concept first though. Please shed light on me.

Ping

               if (abs(deltx)<1 && abs(delty)<1)
>                {
> -                       /* don't move the cursor */
> -                       if (suppress == 1)
> -                       {
> -                               /* send other events, such as button/wheel
> */
> -                               filtered.x = priv->oldX;
> -                               filtered.y = priv->oldY;
> -                       }
> -                       else /* no other events to send */
> +                       /* We have no other data in this event, skip */
> +                       if (suppress == SUPPRESS_NON_MOTION)
>                        {
>                                DBG(10, common, "Ignore non-movement
> relative data \n");
>                                return;
>                        }
> +
> +                       /* send other events, such as button/wheel */
> +                       filtered.x = priv->oldX;
> +                       filtered.y = priv->oldY;
>                }
>        }
>
> diff --git a/src/xf86Wacom.h b/src/xf86Wacom.h
> index 5ddb4e4..ac012f4 100644
> --- a/src/xf86Wacom.h
> +++ b/src/xf86Wacom.h
> @@ -175,6 +175,12 @@ extern WacomCommonPtr wcmRefCommon(WacomCommonPtr
> common);
>  extern void wcmFreeCommon(WacomCommonPtr *common);
>  extern WacomCommonPtr wcmNewCommon(void);
>
> +enum WacomSuppressMode {
> +       SUPPRESS_NONE = 8,      /* Process event normally */
> +       SUPPRESS_ALL,           /* Supress and discard the whole event */
> +       SUPPRESS_NON_MOTION     /* Supress all events but x/y motion */
> +};
> +
>
>  
> /****************************************************************************/
>  #endif /* __XF86WACOM_H */
>
> diff --git a/test/wacom-tests.c b/test/wacom-tests.c
> index 2d48e18..b8ad63c 100644
> --- a/test/wacom-tests.c
> +++ b/test/wacom-tests.c
> @@ -216,6 +216,19 @@ test_initial_size(void)
>
>  }
>
> +static void
> +test_suppress(void)
> +{
> +       enum WacomSuppressMode rc;
> +       WacomCommonRec common = {0};
> +       WacomDeviceState old = {0},
> +                        new = {0};
> +
> +       common.wcmSuppress = 2;
> +
> +       rc = wcmCheckSuppress(&common, &old, &new);
> +       g_assert(rc == SUPPRESS_ALL);
> +}
>
>  int main(int argc, char** argv)
>  {
> @@ -223,6 +236,7 @@ int main(int argc, char** argv)
>        g_test_add_func("/common/refcounting", test_common_ref);
>        g_test_add_func("/common/rebase_pressure", test_rebase_pressure);
>        g_test_add_func("/common/normalize_pressure",
> test_normalize_pressure);
> +       g_test_add_func("/common/test_suppress", test_suppress);
>        g_test_add_func("/xfree86/initial_size", test_initial_size);
>        return g_test_run();
>  }
> --
> 1.7.4
>
>
>
> ------------------------------------------------------------------------------
> What You Don't Know About Data Connectivity CAN Hurt You
> This paper provides an overview of data connectivity, details
> its effect on application quality, and explores various alternative
> solutions. http://p.sf.net/sfu/progress-d2d
> _______________________________________________
> Linuxwacom-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
>
------------------------------------------------------------------------------
What You Don't Know About Data Connectivity CAN Hurt You
This paper provides an overview of data connectivity, details
its effect on application quality, and explores various alternative
solutions. http://p.sf.net/sfu/progress-d2d
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to