On Thu, Aug 05, 2010 at 11:56:20PM -0700, Ping Cheng wrote:
> On Thu, Aug 5, 2010 at 11:17 PM, Peter Hutterer
> <[email protected]> wrote:
> > Instead of a separate variables, keep just one array with all values. Keep
> > x/y for readability though, they just point to the first two spots in the
> > array.
> >
> > Aside from prettier function signatures, we can now call up priv->naxes once
> > instead of relying on magic state.
> >
> > Signed-off-by: Peter Hutterer <[email protected]>
> 
> Acked-by: Ping Cheng <[email protected]>

thanks. two things about this patch I found before pushing - the
search/replace was incomplete, there are still a few places where it calls
xf86PostButtonEvent instead of xf86PostButtonEventP. -ENOCOFFEE, sorry.

the other thing - when I tested the pad again, I saw cursor jumps. there's a
bug in the X server API that causes it to modify values in-place and the
data submitted by the driver for click events is then bogus on the second
call to xf86PostButtonEventP. I think I'll leave this patch for now until
the X server is fixed.

Cheers,
  Peter

> > ---
> >  src/wcmCommon.c |  157 
> > +++++++++++++++++++++++++++----------------------------
> >  1 files changed, 77 insertions(+), 80 deletions(-)
> >
> > diff --git a/src/wcmCommon.c b/src/wcmCommon.c
> > index 5287bf5..c567bca 100644
> > --- a/src/wcmCommon.c
> > +++ b/src/wcmCommon.c
> > @@ -42,7 +42,7 @@ static void commonDispatchDevice(WacomCommonPtr common, 
> > unsigned int channel,
> >        const WacomChannelPtr pChannel, int suppress);
> >  static void resetSampleCounter(const WacomChannelPtr pChannel);
> >  static void sendAButton(InputInfoPtr pInfo, int button, int mask,
> > -               int rx, int ry, int rz, int v3, int v4, int v5);
> > +                       int naxes, int *valuators);
> >
> >  /*****************************************************************************
> >  * Utility functions
> > @@ -238,8 +238,7 @@ static void wcmSetScreen(InputInfoPtr pInfo, int v0, 
> > int v1)
> >  *   previous one.
> >  ****************************************************************************/
> >
> > -static void wcmSendButtons(InputInfoPtr pInfo, int buttons, int rx, int ry,
> > -               int rz, int v3, int v4, int v5)
> > +static void wcmSendButtons(InputInfoPtr pInfo, int buttons, int naxes, int 
> > *valuators)
> >  {
> >        int button, mask;
> >        WacomDevicePtr priv = (WacomDevicePtr) pInfo->private;
> > @@ -257,7 +256,7 @@ static void wcmSendButtons(InputInfoPtr pInfo, int 
> > buttons, int rx, int ry,
> >
> >                                if (buttons == 1) {
> >                                        /* Button 1 pressed */
> > -                                       sendAButton(pInfo, 0, 1, rx, ry, 
> > rz, v3, v4, v5);
> > +                                       sendAButton(pInfo, 0, 1, naxes, 
> > valuators);
> >                                } else {
> >                                        /* send all pressed buttons down */
> >                                        for (button=2; 
> > button<=WCM_MAX_BUTTONS; button++)
> > @@ -266,8 +265,7 @@ static void wcmSendButtons(InputInfoPtr pInfo, int 
> > buttons, int rx, int ry,
> >                                                if ( buttons & mask )
> >                                                {
> >                                                        /* set to the 
> > configured button */
> > -                                                       sendAButton(pInfo, 
> > button-1, 1, rx, ry,
> > -                                                                       rz, 
> > v3, v4, v5);
> > +                                                       sendAButton(pInfo, 
> > button-1, 1, naxes, valuators);
> >                                                }
> >                                        }
> >                                }
> > @@ -281,7 +279,7 @@ static void wcmSendButtons(InputInfoPtr pInfo, int 
> > buttons, int rx, int ry,
> >                                        {
> >                                                /* set to the configured 
> > buttons */
> >                                                sendAButton(pInfo, button-1, 
> > mask & buttons,
> > -                                                       rx, ry, rz, v3, v4, 
> > v5);
> > +                                                           naxes, 
> > valuators);
> >                                        }
> >                                }
> >                        }
> > @@ -297,8 +295,8 @@ static void wcmSendButtons(InputInfoPtr pInfo, int 
> > buttons, int rx, int ry,
> >                                if ((mask & priv->oldButtons) != (mask & 
> > buttons) || (mask & buttons) )
> >                                {
> >                                        /* set to the configured button */
> > -                                       sendAButton(pInfo, button-1, 0, rx, 
> > ry,
> > -                                               rz, v3, v4, v5);
> > +                                       sendAButton(pInfo, button-1, 0,
> > +                                                   naxes, valuators);
> >                                }
> >                        }
> >                }
> > @@ -311,8 +309,8 @@ static void wcmSendButtons(InputInfoPtr pInfo, int 
> > buttons, int rx, int ry,
> >                        if ((mask & priv->oldButtons) != (mask & buttons))
> >                        {
> >                                /* set to the configured button */
> > -                               sendAButton(pInfo, button-1, mask & 
> > buttons, rx, ry,
> > -                                       rz, v3, v4, v5);
> > +                               sendAButton(pInfo, button-1, mask & buttons,
> > +                                           naxes, valuators);
> >                        }
> >                }
> >        }
> > @@ -378,7 +376,7 @@ static int countPresses(int keybtn, unsigned int* keys, 
> > int size)
> >  *   Send one button event, called by wcmSendButtons
> >  ****************************************************************************/
> >  static void sendAButton(InputInfoPtr pInfo, int button, int mask,
> > -               int rx, int ry, int rz, int v3, int v4, int v5)
> > +                       int naxes, int *valuators)
> >  {
> >        WacomDevicePtr priv = (WacomDevicePtr) pInfo->private;
> >  #ifdef DEBUG
> > @@ -386,8 +384,6 @@ static void sendAButton(InputInfoPtr pInfo, int button, 
> > int mask,
> >  #endif
> >        int i;
> >
> > -       int naxes = priv->naxes;
> > -
> >        if (!priv->button[button])  /* ignore this button event */
> >                return;
> >
> > @@ -400,8 +396,8 @@ static void sendAButton(InputInfoPtr pInfo, int button, 
> > int mask,
> >        if (!priv->keys[button][0])
> >        {
> >                /* No button action configured, send button */
> > -               xf86PostButtonEvent(pInfo->dev, is_absolute(pInfo), 
> > priv->button[button], (mask != 0), 0, naxes,
> > -                                   rx, ry, rz, v3, v4, v5);
> > +               xf86PostButtonEventP(pInfo->dev, is_absolute(pInfo), 
> > priv->button[button], (mask != 0), 0, naxes,
> > +                                   valuators);
> >                return;
> >        }
> >
> > @@ -422,7 +418,7 @@ static void sendAButton(InputInfoPtr pInfo, int button, 
> > int mask,
> >                                        xf86PostButtonEvent(pInfo->dev,
> >                                                            
> > is_absolute(pInfo), btn_no,
> >                                                            is_press, 0, 
> > naxes,
> > -                                                           rx, ry, rz, v3, 
> > v4, v5);
> > +                                                           valuators);
> >                                }
> >                                break;
> >                        case AC_KEY:
> > @@ -441,13 +437,13 @@ static void sendAButton(InputInfoPtr pInfo, int 
> > button, int mask,
> >                         * there's no reason to have a DBLCLICK */
> >                        case AC_DBLCLICK:
> >                                xf86PostButtonEvent(pInfo->dev, 
> > is_absolute(pInfo),
> > -                                                   1,1,0,naxes, 
> > rx,ry,rz,v3,v4,v5);
> > +                                                   1,1,0,naxes,valuators);
> >                                xf86PostButtonEvent(pInfo->dev, 
> > is_absolute(pInfo),
> > -                                                   
> > 1,0,0,naxes,rx,ry,rz,v3,v4,v5);
> > +                                                   1,0,0,naxes,valuators);
> >                                xf86PostButtonEvent(pInfo->dev, 
> > is_absolute(pInfo),
> > -                                                   1,1,0,naxes, 
> > rx,ry,rz,v3,v4,v5);
> > +                                                   1,1,0,naxes,valuators);
> >                                xf86PostButtonEvent(pInfo->dev, 
> > is_absolute(pInfo),
> > -                                                   
> > 1,0,0,naxes,rx,ry,rz,v3,v4,v5);
> > +                                                   1,0,0,naxes,valuators);
> >                                break;
> >                        case AC_DISPLAYTOGGLE:
> >                                toggleDisplay(pInfo);
> > @@ -475,7 +471,7 @@ static void sendAButton(InputInfoPtr pInfo, int button, 
> > int mask,
> >                                                
> > xf86PostButtonEvent(pInfo->dev,
> >                                                                
> > is_absolute(pInfo), btn_no,
> >                                                                0, 0, naxes,
> > -                                                               rx, ry, rz, 
> > v3, v4, v5);
> > +                                                               valuators);
> >                                }
> >                                break;
> >                        case AC_KEY:
> > @@ -578,10 +574,10 @@ static int getWheelButton(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds)
> >  ****************************************************************************/
> >
> >  static void sendWheelStripEvents(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds,
> > -               int x, int y, int z, int v3, int v4, int v5)
> > +                                int naxes, int *valuators)
> >  {
> >        WacomDevicePtr priv = (WacomDevicePtr) pInfo->private;
> > -       int fakeButton = 0, naxes = priv->naxes;
> > +       int fakeButton = 0;
> >
> >        DBG(10, priv, "\n");
> >
> > @@ -596,10 +592,10 @@ static void sendWheelStripEvents(InputInfoPtr pInfo, 
> > const WacomDeviceState* ds,
> >            case AC_BUTTON:
> >                /* send both button on/off in the same event for pad */
> >                xf86PostButtonEvent(pInfo->dev, is_absolute(pInfo), 
> > fakeButton & AC_CODE,
> > -                       1,0,naxes,x,y,z,v3,v4,v5);
> > +                       1,0,naxes,valuators);
> >
> >                xf86PostButtonEvent(pInfo->dev, is_absolute(pInfo), 
> > fakeButton & AC_CODE,
> > -                       0,0,naxes,x,y,z,v3,v4,v5);
> > +                       0,0,naxes,valuators);
> >            break;
> >
> >            case AC_KEY:
> > @@ -617,20 +613,20 @@ static void sendWheelStripEvents(InputInfoPtr pInfo, 
> > const WacomDeviceState* ds,
> >  *   Send events common between pad and stylus/cursor/eraser.
> >  ****************************************************************************/
> >
> > -static void sendCommonEvents(InputInfoPtr pInfo, const WacomDeviceState* 
> > ds, int x, int y, int z, int v3, int v4, int v5)
> > +static void sendCommonEvents(InputInfoPtr pInfo, const WacomDeviceState* 
> > ds, int naxes, int *valuators)
> >  {
> >        WacomDevicePtr priv = (WacomDevicePtr) pInfo->private;
> >        int buttons = ds->buttons;
> >
> >        /* send button events when state changed or first time in prox and 
> > button unpresses */
> >        if (priv->oldButtons != buttons || (!priv->oldProximity && !buttons))
> > -               wcmSendButtons(pInfo,buttons,x,y,z,v3,v4,v5);
> > +               wcmSendButtons(pInfo, buttons, naxes, valuators);
> >
> >        /* emulate wheel/strip events when defined */
> >        if ( ds->relwheel || ds->abswheel ||
> >                ( (ds->stripx - priv->oldStripX) && ds->stripx && 
> > priv->oldStripX) ||
> >                        ((ds->stripy - priv->oldStripY) && ds->stripy && 
> > priv->oldStripY) )
> > -               sendWheelStripEvents(pInfo, ds, x, y, z, v3, v4, v5);
> > +               sendWheelStripEvents(pInfo, ds, naxes, valuators);
> >  }
> >
> >  /* rotate x and y before post X inout events */
> > @@ -705,15 +701,18 @@ void wcmSendEvents(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds)
> >        int id = ds->device_id;
> >        int serial = (int)ds->serial_num;
> >        int is_proximity = ds->proximity;
> > -       int x = ds->x;
> > -       int y = ds->y;
> > -       int z = ds->pressure;
> >        int buttons = ds->buttons;
> >        int tx = ds->tiltx;
> >        int ty = ds->tilty;
> >        WacomDevicePtr priv = (WacomDevicePtr) pInfo->private;
> >        int naxes = priv->naxes;
> > -       int v3, v4, v5;
> > +       int valuators[6];
> > +       int *x = &valuators[0];
> > +       int *y = &valuators[1];
> > +
> > +       *x = ds->x;
> > +       *y = ds->y;
> > +       valuators[2] = ds->pressure;
> >
> >        if (priv->serial && serial != priv->serial)
> >        {
> > @@ -726,8 +725,8 @@ void wcmSendEvents(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds)
> >        /* don't move the cursor when going out-prox */
> >        if (!ds->proximity)
> >        {
> > -               x = priv->oldX;
> > -               y = priv->oldY;
> > +               *x = priv->oldX;
> > +               *y = priv->oldY;
> >        }
> >
> >        /* use tx and ty to report stripx and stripy */
> > @@ -744,34 +743,34 @@ void wcmSendEvents(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds)
> >                        (type == ERASER_ID) ? "eraser" :
> >                        (type == TOUCH_ID) ? "touch" : "pad",
> >                priv->oldProximity ? "true" : "false",
> > -               x, y, z, is_button ? "true" : "false", buttons,
> > +               *x, *y, valuators[2], is_button ? "true" : "false", buttons,
> >                tx, ty, ds->abswheel, ds->rotation, ds->throttle);
> >
> >        if (ds->proximity)
> > -               wcmRotateCoordinates(pInfo, &x, &y);
> > +               wcmRotateCoordinates(pInfo, x, y);
> >
> >        if (IsCursor(priv))
> >        {
> > -               v3 = ds->rotation;
> > -               v4 = ds->throttle;
> > +               valuators[3] = ds->rotation;
> > +               valuators[4] = ds->throttle;
> >        }
> >        else  /* Intuos styli have tilt */
> >        {
> > -               v3 = tx;
> > -               v4 = ty;
> > +               valuators[3] = tx;
> > +               valuators[4] = ty;
> >        }
> > -       v5 = ds->abswheel;
> > +       valuators[5] = ds->abswheel;
> >
> >        DBG(6, priv, "%s prox=%d\tx=%d"
> > -               "\ty=%d\tz=%d\tv3=%d\tv4=%d\tv5=%d\tid=%d"
> > +               
> > "\ty=%d\tz=%d\tv3=%d\tvaluators[4]=%d\tvaluators[5]=%d\tid=%d"
> >                "\tserial=%u\tbutton=%s\tbuttons=%d\n",
> >                is_absolute(pInfo) ? "abs" : "rel",
> >                is_proximity,
> > -               x, y, z, v3, v4, v5, id, serial,
> > +               *x, *y, valuators[2], valuators[3], valuators[4], 
> > valuators[5], id, serial,
> >                is_button ? "true" : "false", buttons);
> >
> > -       priv->currentX = x;
> > -       priv->currentY = y;
> > +       priv->currentX = *x;
> > +       priv->currentY = *y;
> >
> >        /* update the old records */
> >        if(!priv->oldProximity)
> > @@ -782,19 +781,19 @@ void wcmSendEvents(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds)
> >
> >        if (!is_absolute(pInfo))
> >        {
> > -               x -= priv->oldX;
> > -               y -= priv->oldY;
> > -               z -= priv->oldZ;
> > +               *x -= priv->oldX;
> > +               *y -= priv->oldY;
> > +               valuators[2] -= priv->oldZ;
> >                if (IsCursor(priv))
> >                {
> > -                       v3 -= priv->oldRot;
> > -                       v4 -= priv->oldThrottle;
> > +                       valuators[3] -= priv->oldRot;
> > +                       valuators[4] -= priv->oldThrottle;
> >                } else
> >                {
> > -                       v3 -= priv->oldTiltX;
> > -                       v4 -= priv->oldTiltY;
> > +                       valuators[3] -= priv->oldTiltX;
> > +                       valuators[4] -= priv->oldTiltY;
> >                }
> > -               v5 -= priv->oldWheel;
> > +               valuators[5] -= priv->oldWheel;
> >        }
> >
> >        if (type != PAD_ID)
> > @@ -806,31 +805,30 @@ void wcmSendEvents(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds)
> >                         * screen and modify the axes before posting events 
> > */
> >                        if(!(priv->flags & BUTTONS_ONLY_FLAG))
> >                        {
> > -                               wcmSetScreen(pInfo, x, y);
> > +                               wcmSetScreen(pInfo, *x, *y);
> >                        }
> >
> >                        /* unify acceleration in both directions
> >                         * for relative mode to draw a circle
> >                         */
> >                        if (!is_absolute(pInfo))
> > -                               x *= priv->factorY / priv->factorX;
> > +                               *x *= priv->factorY / priv->factorX;
> >                        else
> >                        {
> >                                /* Padding virtual values */
> >                                wcmVirtualTabletPadding(pInfo);
> > -                               x += priv->leftPadding;
> > -                               y += priv->topPadding;
> > +                               *x += priv->leftPadding;
> > +                               *y += priv->topPadding;
> >                        }
> >
> >                        /* don't emit proximity events if device does not 
> > support proximity */
> >                        if ((pInfo->dev->proximity && !priv->oldProximity))
> > -                               xf86PostProximityEvent(pInfo->dev, 1, 0, 
> > naxes, x, y, z, v3, v4, v5);
> > +                               xf86PostProximityEventP(pInfo->dev, 1, 0, 
> > naxes, valuators);
> >
> >                        /* Move the cursor to where it should be before 
> > sending button events */
> >                        if(!(priv->flags & BUTTONS_ONLY_FLAG))
> >                        {
> > -                               xf86PostMotionEvent(pInfo->dev, 
> > is_absolute(pInfo),
> > -                                       0, naxes, x, y, z, v3, v4, v5);
> > +                               xf86PostMotionEventP(pInfo->dev, 
> > is_absolute(pInfo), 0, naxes, valuators);
> >                                /* For relative events, reset the axes as
> >                                 * we've already moved the device by the
> >                                 * relative amount. Otherwise, a button
> > @@ -839,12 +837,12 @@ void wcmSendEvents(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds)
> >                                 */
> >                                if (!is_absolute(pInfo))
> >                                {
> > -                                       x = y = z = 0;
> > -                                       v3 = v4 = v5 = 0;
> > +                                       *x = *y = valuators[2] = 0;
> > +                                       valuators[3] = valuators[4] = 
> > valuators[5] = 0;
> >                                }
> >                        }
> >
> > -                       sendCommonEvents(pInfo, ds, x, y, z, v3, v4, v5);
> > +                       sendCommonEvents(pInfo, ds, naxes, valuators);
> >                }
> >                else /* not in proximity */
> >                {
> > @@ -853,46 +851,45 @@ void wcmSendEvents(InputInfoPtr pInfo, const 
> > WacomDeviceState* ds)
> >                        /* reports button up when the device has been
> >                         * down and becomes out of proximity */
> >                        if (priv->oldButtons)
> > -                               
> > wcmSendButtons(pInfo,buttons,x,y,z,v3,v4,v5);
> > +                               
> > wcmSendButtons(pInfo,buttons,naxes,valuators);
> >
> >                        if (priv->oldProximity)
> > -                               
> > xf86PostProximityEvent(pInfo->dev,0,0,naxes,x,y,z,v3,v4,v5);
> > +                               
> > xf86PostProximityEventP(pInfo->dev,0,0,naxes,valuators);
> >                } /* not in proximity */
> >        }
> >        else
> >        {
> > -               if (v3 || v4 || v5 || buttons || ds->relwheel)
> > +               if (valuators[3] || valuators[4] || valuators[5] || buttons 
> > || ds->relwheel)
> >                {
> > -                       x = 0;
> > -                       y = 0;
> > -                       if ( v3 || v4 || v5 )
> > -                               wcmSetScreen(pInfo, x, y);
> > +                       *x = 0;
> > +                       *y = 0;
> > +                       if ( valuators[3] || valuators[4] || valuators[5] )
> > +                               wcmSetScreen(pInfo, *x, *y);
> >                }
> >
> >                if (!priv->oldProximity && is_proximity)
> > -                       xf86PostProximityEvent(pInfo->dev, 1, 0, naxes, x, 
> > y, z, v3, v4, v5);
> > +                       xf86PostProximityEventP(pInfo->dev, 1, 0, 
> > naxes,valuators);
> >
> > -               if (v3 || v4 || v5 || buttons || ds->relwheel)
> > +               if (valuators[3] || valuators[4] || valuators[5] || buttons 
> > || ds->relwheel)
> >                {
> > -                       sendCommonEvents(pInfo, ds, x, y, z, v3, v4, v5);
> > +                       sendCommonEvents(pInfo, ds, naxes, valuators);
> >
> >                        /* xf86PostMotionEvent is only needed to post the 
> > valuators
> >                         * It should NOT move the cursor.
> >                         */
> > -                       if ( v3 || v4 || v5 )
> > +                       if ( valuators[3] || valuators[4] || valuators[5] )
> >                        {
> > -                               xf86PostMotionEvent(pInfo->dev, 
> > is_absolute(pInfo),
> > -                                       0, naxes, x, y, z, v3, v4, v5);
> > +                               xf86PostMotionEventP(pInfo->dev, 
> > is_absolute(pInfo), 0, naxes, valuators);
> >                        }
> >                }
> >                else
> >                {
> >                        if (priv->oldButtons)
> > -                               wcmSendButtons(pInfo, buttons,
> > -                                       x, y, z, v3, v4, v5);
> > +                               wcmSendButtons(pInfo, buttons, naxes,
> > +                                               valuators);
> >                }
> >                if (priv->oldProximity && !is_proximity)
> > -                       xf86PostProximityEvent(pInfo->dev, 0, 0, naxes, x, 
> > y, z, v3, v4, v5);
> > +                       xf86PostProximityEventP(pInfo->dev, 0, 0, naxes, 
> > valuators);
> >        }
> >        priv->oldProximity = is_proximity;
> >        priv->old_device_id = id;
> > --
> > 1.7.2
> 
------------------------------------------------------------------------------
This SF.net email is sponsored by 

Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev 
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to