On Thu, Oct 01, 2015 at 10:57:17PM +0200, Pavel Rojtberg wrote:
> From: Pavel Rojtberg <rojtb...@gmail.com>
> 
> as discussed here[0], x360w is the only pad that maps dpad_to_button.
> This is bad for downstream developers as they have to differ between
> x360 and x360w which is not intuitive.
> 
> This patch implements the suggested solution of exposing the dpad both
> as axes and as buttons. This retains backward compability with software
> already dealing with the difference while makes new software work as
> expected across x360/ x360w pads.
> 
> [0] http://www.spinics.net/lists/linux-input/msg34421.html
> 
> Signed-off-by: Pavel Rojtberg <rojtb...@gmail.com>

Applied, thank you.

> ---
>  drivers/input/joystick/xpad.c | 18 ++++++++++++++++--
>  1 file changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
> index 1195dbb..15da2a3 100644
> --- a/drivers/input/joystick/xpad.c
> +++ b/drivers/input/joystick/xpad.c
> @@ -436,7 +436,14 @@ static void xpad360_process_packet(struct usb_xpad *xpad,
>               input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
>               input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
>               input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
> -     } else {
> +     }
> +     /* this should be a simple else block. However historically xbox360w
> +      * has mapped DPAD to buttons while xbox360 did not.
> +      * This made no sense, but now we can not just switch back and have to
> +      * support both behaviors.
> +      */
> +     if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
> +                     xpad->xtype == XTYPE_XBOX360W) {
>               input_report_abs(dev, ABS_HAT0X,
>                                !!(data[2] & 0x08) - !!(data[2] & 0x04));
>               input_report_abs(dev, ABS_HAT0Y,
> @@ -1144,7 +1151,14 @@ static int xpad_probe(struct usb_interface *intf, 
> const struct usb_device_id *id
>       if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
>               for (i = 0; xpad_btn_pad[i] >= 0; i++)
>                       __set_bit(xpad_btn_pad[i], input_dev->keybit);
> -     } else {
> +     }
> +     /* this should be a simple else block. However historically xbox360w
> +      * has mapped DPAD to buttons while xbox360 did not.
> +      * This made no sense, but now we can not just switch back and have to
> +      * support both behaviors.
> +      */
> +     if(!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
> +                     xpad->xtype == XTYPE_XBOX360W) {
>               for (i = 0; xpad_abs_pad[i] >= 0; i++)
>                       xpad_set_up_abs(input_dev, xpad_abs_pad[i]);
>       }
> -- 
> 1.9.1
> 

-- 
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to