On Sun, Oct 23, 2011 at 9:13 PM, Peter Hutterer
<peter.hutte...@who-t.net> wrote:
> On Fri, Oct 21, 2011 at 06:37:25PM -0700, Jason Gerecke wrote:
>> Touch strips as well as the first touch ring are set up to emulate
>> mouse wheel events by default. This patch duplicates this behavior
>> for the second touch ring, so that it behaves in an identical manner.
>>
>> Signed-off-by: Jason Gerecke <killert...@gmail.com>
>> ---
>>  src/wcmCommon.c         |   29 +++++++++++++++++++++++++++--
>>  src/wcmConfig.c         |    2 ++
>>  src/wcmValidateDevice.c |    4 ++--
>>  src/wcmXCommand.c       |   18 ++++++++++++++----
>>  src/xf86WacomDefs.h     |    8 +++++---
>>  tools/xsetwacom.c       |   20 ++++++++++++++++++++
>>  6 files changed, 70 insertions(+), 11 deletions(-)
>>
>> diff --git a/src/wcmCommon.c b/src/wcmCommon.c
>> index f6ddf8a..a6c55b9 100644
>> --- a/src/wcmCommon.c
>> +++ b/src/wcmCommon.c
>> @@ -363,6 +363,31 @@ static int getWheelButton(InputInfoPtr pInfo, const 
>> WacomDeviceState* ds,
>>               *fakeKey = (value > 0) ? priv->wheel_keys[2+1] : 
>> priv->wheel_keys[3+1];
>>       }
>>
>> +     /* emulate events for 2nd absolute wheel when it is a touch ring (on 
>> pad) */
>> +     if ( (ds->abswheel2 != priv->oldWheel2) && IsPad(priv) &&
>> +         (priv->oldProximity == ds->proximity))
>> +     {
>> +             int wrap_delta;
>> +             value = priv->oldWheel2 - ds->abswheel2;
>> +
>> +             /* Wraparound detection. If the distance oldvalue..value is
>> +              * larger than the oldvalue..value considering the
>> +              * wraparound, assume wraparound and readjust */
>> +             if (value < 0)
>> +                     wrap_delta = ((MAX_PAD_RING + 1) + priv->oldWheel2) - 
>> ds->abswheel2;
>> +             else
>> +                     wrap_delta = priv->oldWheel2 - ((MAX_PAD_RING + 1) + 
>> ds->abswheel2);
>> +
>> +             DBG(12, priv, "wrap detection for %d (old %d): %d (wrap %d)\n",
>> +                 ds->abswheel2, priv->oldWheel2, value, wrap_delta);
>> +
>> +             if (abs(wrap_delta) < abs(value))
>> +                     value = wrap_delta;
>> +
>> +             fakeButton = (value > 0) ? priv->wheel2up : priv->wheel2dn;
>> +             *fakeKey = (value > 0) ? priv->wheel_keys[4+1] : 
>> priv->wheel_keys[5+1];
>> +     }
>> +
>
> this needs to be in a function that's called with the different
> abswheel/oldWheel structs as parameters. Copying code is evil.
>
Taking a closer look, this function is fundamentally broken. If
multiple wheels/strips on a device change simultaneously, only the
last one to be evaluated will have an event sent. It seems like this
should be transformed into a generic function (or possibly two: one
for wraparound devices, and one for non-) that can return the correct
thing for a single wheel or strip. The caller (sendWheelStripEvents)
would be modified to call it once for each wheel and strip, sending
the necessary buttons or actions for each.

It's going to take some work to make it not completely ugly though...

>
>>       /* emulate events for left strip */
>>       if ( ds->stripx != priv->oldStripX )
>>       {
>> @@ -439,7 +464,7 @@ static void sendCommonEvents(InputInfoPtr pInfo, const 
>> WacomDeviceState* ds,
>>               wcmSendButtons(pInfo,buttons, first_val, num_vals, valuators);
>>
>>       /* emulate wheel/strip events when defined */
>> -     if ( ds->relwheel || (ds->abswheel != priv->oldWheel) ||
>> +     if ( ds->relwheel || (ds->abswheel != priv->oldWheel) || 
>> (ds->abswheel2 != priv->oldWheel2) ||
>>               ( (ds->stripx - priv->oldStripX) && ds->stripx && 
>> priv->oldStripX) ||
>>                       ((ds->stripy - priv->oldStripY) && ds->stripy && 
>> priv->oldStripY) )
>>               sendWheelStripEvents(pInfo, ds, first_val, num_vals, 
>> valuators);
>> @@ -540,7 +565,7 @@ wcmSendPadEvents(InputInfoPtr pInfo, const 
>> WacomDeviceState* ds,
>>               if (valuators[i])
>>                       break;
>>       if (i < num_vals || ds->buttons || ds->relwheel ||
>> -         (ds->abswheel != priv->oldWheel))
>> +         (ds->abswheel != priv->oldWheel) || (ds->abswheel2 != 
>> priv->oldWheel2))
>>       {
>>               sendCommonEvents(pInfo, ds, first_val, num_vals, valuators);
>>
>> diff --git a/src/wcmConfig.c b/src/wcmConfig.c
>> index 94b188d..567c3e7 100644
>> --- a/src/wcmConfig.c
>> +++ b/src/wcmConfig.c
>> @@ -80,6 +80,8 @@ static int wcmAllocate(InputInfoPtr pInfo)
>>        * later in wcmParseOptions, when we have IsPad() available */
>>       priv->wheelup = 0;                      /* Default absolute wheel up 
>> event */
>>       priv->wheeldn = 0;                      /* Default absolute wheel down 
>> event */
>> +     priv->wheel2up = 0;                     /* Default absolute wheel2 up 
>> event */
>> +     priv->wheel2dn = 0;                     /* Default absolute wheel2 
>> down event */
>>       priv->striplup = 4;                     /* Default left strip up event 
>> */
>>       priv->stripldn = 5;                     /* Default left strip down 
>> event */
>>       priv->striprup = 4;                     /* Default right strip up 
>> event */
>> diff --git a/src/wcmValidateDevice.c b/src/wcmValidateDevice.c
>> index 34cae91..bde010c 100644
>> --- a/src/wcmValidateDevice.c
>> +++ b/src/wcmValidateDevice.c
>> @@ -713,8 +713,8 @@ Bool wcmParseOptions(InputInfoPtr pInfo, Bool 
>> is_primary, Bool is_dependent)
>>        */
>>       if (IsPad(priv))
>>       {
>> -             priv->wheelup = 4;
>> -             priv->wheeldn = 5;
>> +             priv->wheelup = priv->wheel2up = 4;
>> +             priv->wheeldn = priv->wheel2dn = 5;
>>               set_absolute(pInfo, TRUE);
>>       }
>>
>> diff --git a/src/wcmXCommand.c b/src/wcmXCommand.c
>> index 82f9b80..f5c90e4 100644
>> --- a/src/wcmXCommand.c
>> +++ b/src/wcmXCommand.c
>> @@ -237,7 +237,7 @@ void InitWcmDeviceProperties(InputInfoPtr pInfo)
>>       if (IsPad(priv) || IsCursor(priv))
>>       {
>>               memset(values, 0, sizeof(values));
>> -             prop_wheel_buttons = InitWcmAtom(pInfo->dev, 
>> WACOM_PROP_WHEELBUTTONS, XA_ATOM, 32, 4, values);
>> +             prop_wheel_buttons = InitWcmAtom(pInfo->dev, 
>> WACOM_PROP_WHEELBUTTONS, XA_ATOM, 32, 6, values);
>>       }
>>
>>       values[0] = common->vendor_id;
>> @@ -456,6 +456,8 @@ struct wheel_strip_update_t {
>>       int *dn1;
>>       int *up2;
>>       int *dn2;
>> +     int *up3;
>> +     int *dn3;
>>
>>       /* for CARD32 values, points to atom array of atoms to be
>>        * monitored.*/
>> @@ -477,7 +479,7 @@ static int wcmSetWheelOrStripProperty(DeviceIntPtr dev, 
>> Atom property,
>>               CARD32 *v32;
>>       } values;
>>
>> -     if (prop->size != 4)
>> +     if (prop->size != 6)
>>               return BadValue;
>>
>>       /* see wcmSetPropertyButtonActions for how this works. The wheel is
>> @@ -492,7 +494,9 @@ static int wcmSetWheelOrStripProperty(DeviceIntPtr dev, 
>> Atom property,
>>                       if (values.v8[0] > WCM_MAX_MOUSE_BUTTONS ||
>>                           values.v8[1] > WCM_MAX_MOUSE_BUTTONS ||
>>                           values.v8[2] > WCM_MAX_MOUSE_BUTTONS ||
>> -                         values.v8[3] > WCM_MAX_MOUSE_BUTTONS)
>> +                         values.v8[3] > WCM_MAX_MOUSE_BUTTONS ||
>> +                         values.v8[4] > WCM_MAX_MOUSE_BUTTONS ||
>> +                         values.v8[5] > WCM_MAX_MOUSE_BUTTONS)
>>                               return BadValue;
>>
>>                       if (!checkonly) {
>> @@ -500,6 +504,8 @@ static int wcmSetWheelOrStripProperty(DeviceIntPtr dev, 
>> Atom property,
>>                               *wsup->dn1 = values.v8[1];
>>                               *wsup->up2 = values.v8[2];
>>                               *wsup->dn2 = values.v8[3];
>> +                             *wsup->up3 = values.v8[4];
>> +                             *wsup->dn3 = values.v8[5];
>>                       }
>>                       break;
>>               case 32:
>> @@ -534,10 +540,12 @@ static int wcmSetWheelProperty(DeviceIntPtr dev, Atom 
>> property,
>>               .dn1 = &priv->reldn,
>>               .up2 = &priv->wheelup,
>>               .dn2 = &priv->wheeldn,
>> +             .up3 = &priv->wheel2up,
>> +             .dn3 = &priv->wheel2dn,
>>
>>               .handlers = priv->wheel_actions,
>>               .keys     = priv->wheel_keys,
>> -             .skeys    = 4,
>> +             .skeys    = 6,
>>       };
>>
>>       return wcmSetWheelOrStripProperty(dev, property, prop, checkonly, 
>> &wsup);
>> @@ -554,6 +562,8 @@ static int wcmSetStripProperty(DeviceIntPtr dev, Atom 
>> property,
>>               .dn1 = &priv->stripldn,
>>               .up2 = &priv->striprup,
>>               .dn2 = &priv->striprdn,
>> +             .up3 = NULL,
>> +             .dn3 = NULL,
>>
>>               .handlers = priv->strip_actions,
>>               .keys     = priv->strip_keys,
>> diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h
>> index 72c2bd5..c370baa 100644
>> --- a/src/xf86WacomDefs.h
>> +++ b/src/xf86WacomDefs.h
>> @@ -236,10 +236,12 @@ struct _WacomDeviceRec
>>       int reldn;
>>       int wheelup;
>>       int wheeldn;
>> +     int wheel2up;
>> +     int wheel2dn;
>>       /* keystrokes assigned to wheel events (default is the buttons above).
>> -      * Order is relup, reldwn, wheelup, wheeldn. Like 'keys', this array
>> -      * is one-indexed */
>> -     unsigned wheel_keys[4+1][256];
>> +      * Order is relup, reldwn, wheelup, wheeldn, wheel2up, wheel2dn.
>> +      * Like 'keys', this array is one-indexed */
>> +     unsigned wheel_keys[6+1][256];
>>
>>       int striplup;
>>       int stripldn;
>> diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c
>> index 99ca974..b8b3437 100644
>> --- a/tools/xsetwacom.c
>> +++ b/tools/xsetwacom.c
>> @@ -301,6 +301,26 @@ static param_t parameters[] =
>>               .get_func = get_map,
>>       },
>>       {
>> +             .name = "AbsWheel2Up",
>> +             .desc = "X11 event to which absolute wheel up should be 
>> mapped. ",
>> +             .prop_name = WACOM_PROP_WHEELBUTTONS,
>> +             .prop_format = 8,
>> +             .prop_offset = 4,
>> +             .arg_count = 0,
>> +             .set_func = map_actions,
>> +             .get_func = get_map,
>> +     },
>> +     {
>> +             .name = "AbsWheel2Down",
>> +             .desc = "X11 event to which absolute wheel down should be 
>> mapped. ",
>> +             .prop_name = WACOM_PROP_WHEELBUTTONS,
>> +             .prop_format = 8,
>> +             .prop_offset = 5,
>> +             .arg_count = 0,
>> +             .set_func = map_actions,
>> +             .get_func = get_map,
>> +     },
>
> come to think of it, we should really rename that to cw/ccw or so. Up down
> on a wheel is rather ambiguous. For the scope of this patch you can leave it
> though.
>
I was thinking the same thing. I'll add it to my list of things to
look at later.

> Cheers,
>  Peter
>> +     {
>>               .name = "StripLeftUp",
>>               .desc = "X11 event to which left strip up should be mapped. ",
>>               .prop_name = WACOM_PROP_STRIPBUTTONS,
>> --
>> 1.7.6
>
>

Jason

---
Day xee-nee-svsh duu-'ushtlh-ts'it;
nuu-wee-ya' duu-xan' 'vm-nvshtlh-ts'it.
Huu-chan xuu naa~-gha.

------------------------------------------------------------------------------
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to