On Tue, Dec 13, 2011 at 01:59:00PM -0800, 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 | 19 +++++++++++++++---- > src/xf86WacomDefs.h | 8 +++++--- > tools/xsetwacom.c | 20 ++++++++++++++++++++ > 6 files changed, 71 insertions(+), 11 deletions(-) > > diff --git a/src/wcmCommon.c b/src/wcmCommon.c > index 44e74eb..57a1826 100644 > --- a/src/wcmCommon.c > +++ b/src/wcmCommon.c > @@ -361,6 +361,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]; > + } > +
no, please copy that into a function. > /* emulate events for left strip */ > if ( ds->stripx != priv->oldStripX ) > { > @@ -437,7 +462,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); > @@ -538,7 +563,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 783966a..5920e11 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 97df312..862e005 100644 > --- a/src/wcmValidateDevice.c > +++ b/src/wcmValidateDevice.c > @@ -729,8 +729,8 @@ Bool wcmPreInitParseOptions(InputInfoPtr pInfo, Bool > is_primary, > */ > 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..40393dc 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); need to update the comment in wacom-properties.h as well Cheers, Peter > } > > 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,8 @@ static int wcmSetWheelOrStripProperty(DeviceIntPtr dev, > Atom property, > CARD32 *v32; > } values; > > - if (prop->size != 4) > + if ((property == prop_strip_buttons && prop->size != 4) || > + (property == prop_wheel_buttons && prop->size != 6)) > return BadValue; > > /* see wcmSetPropertyButtonActions for how this works. The wheel is > @@ -492,7 +495,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 +505,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 +541,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 +563,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 8f06b8d..c91c67a 100644 > --- a/src/xf86WacomDefs.h > +++ b/src/xf86WacomDefs.h > @@ -237,10 +237,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, > + }, > + { > .name = "StripLeftUp", > .desc = "X11 event to which left strip up should be mapped. ", > .prop_name = WACOM_PROP_STRIPBUTTONS, > -- > 1.7.7.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel