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> --- Changes from v3: * Move after de-duplication patch * Update property docs in wacom-properties.h * Update count of xsetwacom properties include/wacom-properties.h | 4 ++-- src/wcmCommon.c | 14 ++++++++++++-- src/wcmConfig.c | 2 ++ src/wcmValidateDevice.c | 4 ++-- src/wcmXCommand.c | 19 +++++++++++++++---- src/xf86WacomDefs.h | 8 +++++--- tools/xsetwacom.c | 22 +++++++++++++++++++++- 7 files changed, 59 insertions(+), 14 deletions(-) diff --git a/include/wacom-properties.h b/include/wacom-properties.h index 29d5056..0bb84b1 100644 --- a/include/wacom-properties.h +++ b/include/wacom-properties.h @@ -46,9 +46,9 @@ */ #define WACOM_PROP_STRIPBUTTONS "Wacom Strip Buttons" -/* 8 bit, 4 values, rel wheel up, rel wheel down, abs wheel up, abs wheel down +/* 8 bit, 6 values, rel wheel up, rel wheel down, abs wheel up, abs wheel down, abs wheel 2 up, abs wheel 2 down OR - Atom, 4 values , rel wheel up, rel wheel down, abs wheel up, abs wheel down + Atom, 6 values , rel wheel up, rel wheel down, abs wheel up, abs wheel down, abs wheel 2 up, abs wheel 2 down */ #define WACOM_PROP_WHEELBUTTONS "Wacom Wheel Buttons" diff --git a/src/wcmCommon.c b/src/wcmCommon.c index 32eb4e4..885b6b9 100644 --- a/src/wcmCommon.c +++ b/src/wcmCommon.c @@ -470,6 +470,16 @@ static void sendWheelStripEvents(InputInfoPtr pInfo, const WacomDeviceState* ds, priv->wheel_keys[2+1], priv->wheel_keys[3+1], &fakeKey); sendWheelStripEvent(fakeButton, fakeKey, pInfo, first_val, num_vals, valuators); } + + /* emulate events for right touch ring */ + delta = getScrollDelta(ds->abswheel2, priv->oldWheel2, MAX_PAD_RING, AXIS_INVERT); + if (delta && IsPad(priv) && priv->oldProximity == ds->proximity) + { + DBG(10, priv, "Right touch wheel scroll delta = %d\n", delta); + fakeButton = getWheelButton(delta, priv->wheel2up, priv->wheel2dn, + priv->wheel_keys[4+1], priv->wheel_keys[5+1], &fakeKey); + sendWheelStripEvent(fakeButton, fakeKey, pInfo, first_val, num_vals, valuators); + } } /***************************************************************************** @@ -488,7 +498,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); @@ -589,7 +599,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); } 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 e0e58fe..2f3f7b4 100644 --- a/src/xf86WacomDefs.h +++ b/src/xf86WacomDefs.h @@ -239,10 +239,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..9ab285b 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, @@ -2669,7 +2689,7 @@ static void test_parameter_number(void) * deprecated them. * Numbers include trailing NULL entry. */ - assert(ARRAY_SIZE(parameters) == 34); + assert(ARRAY_SIZE(parameters) == 36); assert(ARRAY_SIZE(deprecated_parameters) == 17); } -- 1.7.7.3 ------------------------------------------------------------------------------ Write once. Port to many. Get the SDK and tools to simplify cross-platform app development. Create new or port existing apps to sell to consumers worldwide. Explore the Intel AppUpSM program developer opportunity. appdeveloper.intel.com/join http://p.sf.net/sfu/intel-appdev _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel