Reviewed-by: Ping Cheng <[email protected]>
Ping
On Mon, Mar 21, 2011 at 9:16 PM, Peter Hutterer <[email protected]>wrote:
> Values in, values out. No magic state structs, keep it simple.
>
> Signed-off-by: Peter Hutterer <[email protected]>
> ---
> src/wcmUSB.c | 55
> ++++++++++++++++++++++++++++++++++++---------------
> test/wacom-tests.c | 16 +++++++++++++++
> 2 files changed, 55 insertions(+), 16 deletions(-)
>
> diff --git a/src/wcmUSB.c b/src/wcmUSB.c
> index e7e4366..9e656e2 100644
> --- a/src/wcmUSB.c
> +++ b/src/wcmUSB.c
> @@ -950,11 +950,33 @@ static int usbParseAbsEvent(WacomCommonPtr common,
> return change;
> }
>
> -#define MOD_BUTTONS(bit, value) do { \
> - int shift = 1 << (bit); \
> - ds->buttons = ((value) ? \
> - (ds->buttons | (shift)) : (ds->buttons &
> ~(shift))); \
> - } while (0)
> +/**
> + * Flip the mask bit in buttons corresponding to btn to the specified
> state.
> + *
> + * @param buttons The current button mask
> + * @param btn Zero-indexed button number to change
> + * @param state Zero to unset, non-zero to set the mask for the button
> + *
> + * @return The new button mask
> + */
> +static int mod_buttons(int buttons, int btn, int state)
> +{
> + int mask = 1 << btn;
> +
> + if (btn >= sizeof(int))
> + {
> + xf86Msg(X_ERROR, "%s: Invalid button number %d.
> Insufficient "
> + "storage\n", __func__, btn);
> + return buttons;
> + }
> +
> + if (state)
> + buttons |= mask;
> + else
> + buttons &= ~mask;
> +
> + return buttons;
> +}
>
> static int usbParseAbsMTEvent(WacomCommonPtr common, struct input_event
> *event)
> {
> @@ -983,7 +1005,8 @@ static int usbParseAbsMTEvent(WacomCommonPtr common,
> struct input_event *event)
> */
> if (TabletHasFeature(common, WCM_LCD) &&
> !private->wcmMTChannel)
> - MOD_BUTTONS(0, event->value != -1);
> + ds->buttons = mod_buttons(ds->buttons, 0,
> + (event->value !=
> -1));
> break;
>
> case ABS_MT_POSITION_X:
> @@ -1089,7 +1112,7 @@ static int usbParseKeyEvent(WacomCommonPtr common,
> ds->device_type = TOUCH_ID;
> ds->device_id = TOUCH_DEVICE_ID;
> ds->proximity = event->value;
> - MOD_BUTTONS(0, event->value);
> + ds->buttons =
> mod_buttons(ds->buttons, 0, event->value);
> }
> }
> break;
> @@ -1130,7 +1153,7 @@ static int usbParseKeyEvent(WacomCommonPtr common,
> */
> if (common->wcmCapacityDefault < 0 &&
> (TabletHasFeature(common, WCM_LCD)))
> - MOD_BUTTONS(0, event->value);
> + ds->buttons = mod_buttons(ds->buttons, 0,
> event->value);
> break;
>
> case BTN_TOOL_TRIPLETAP:
> @@ -1165,11 +1188,11 @@ static int usbParseKeyEvent(WacomCommonPtr common,
> switch (event->code)
> {
> case BTN_STYLUS:
> - MOD_BUTTONS(1, event->value);
> + ds->buttons = mod_buttons(ds->buttons, 1,
> event->value);
> break;
>
> case BTN_STYLUS2:
> - MOD_BUTTONS(2, event->value);
> + ds->buttons = mod_buttons(ds->buttons, 2,
> event->value);
> break;
>
> default:
> @@ -1189,25 +1212,25 @@ static int usbParseBTNEvent(WacomCommonPtr common,
> switch (event->code)
> {
> case BTN_LEFT:
> - MOD_BUTTONS(0, event->value);
> + ds->buttons = mod_buttons(ds->buttons, 0,
> event->value);
> break;
>
> case BTN_MIDDLE:
> - MOD_BUTTONS(1, event->value);
> + ds->buttons = mod_buttons(ds->buttons, 1,
> event->value);
> break;
>
> case BTN_RIGHT:
> - MOD_BUTTONS(2, event->value);
> + ds->buttons = mod_buttons(ds->buttons, 2,
> event->value);
> break;
>
> case BTN_SIDE:
> case BTN_BACK:
> - MOD_BUTTONS(3, event->value);
> + ds->buttons = mod_buttons(ds->buttons, 3,
> event->value);
> break;
>
> case BTN_EXTRA:
> case BTN_FORWARD:
> - MOD_BUTTONS(4, event->value);
> + ds->buttons = mod_buttons(ds->buttons, 4,
> event->value);
> break;
>
> default:
> @@ -1215,7 +1238,7 @@ static int usbParseBTNEvent(WacomCommonPtr common,
> {
> if (event->code ==
> common->padkey_code[nkeys])
> {
> - MOD_BUTTONS(nkeys, event->value);
> + ds->buttons =
> mod_buttons(ds->buttons, nkeys, event->value);
> break;
> }
> }
> diff --git a/test/wacom-tests.c b/test/wacom-tests.c
> index 1eec90e..f7b0fcc 100644
> --- a/test/wacom-tests.c
> +++ b/test/wacom-tests.c
> @@ -428,6 +428,21 @@ test_tilt_to_rotation(void)
> }
>
>
> +static void
> +test_mod_buttons(void)
> +{
> + int i;
> + for (i = 0; i < sizeof(int); i++)
> + {
> + int buttons = mod_buttons(0, i, 1);
> + assert(buttons == (1 << i));
> + buttons = mod_buttons(0, i, 0);
> + assert(buttons == 0);
> + }
> +
> + assert(mod_buttons(0, sizeof(int), 1) == 0);
> +}
> +
> int main(int argc, char** argv)
> {
> test_common_ref();
> @@ -436,6 +451,7 @@ int main(int argc, char** argv)
> test_suppress();
> test_initial_size();
> test_tilt_to_rotation();
> + test_mod_buttons();
> return 0;
> }
>
> --
> 1.7.4
>
>
>
> ------------------------------------------------------------------------------
> Enable your software for Intel(R) Active Management Technology to meet the
> growing manageability and security demands of your customers. Businesses
> are taking advantage of Intel(R) vPro (TM) technology - will your software
> be a part of the solution? Download the Intel(R) Manageability Checker
> today! http://p.sf.net/sfu/intel-dev2devmar
> _______________________________________________
> Linuxwacom-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
>
------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software
be a part of the solution? Download the Intel(R) Manageability Checker
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel