[PATCH 1/5] winebus.sys: Order axes before buttons

Aric Stewart aric at codeweavers.com
Wed May 8 16:42:29 CDT 2019


Signed-off-by: Aric Stewart <aric at codeweavers.com>

On 5/7/19 9:01 AM, Andrew Eikum wrote:
> Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
> ---
>   dlls/winebus.sys/bus_sdl.c    | 71 +++++++++++++++++++++++------------
>   dlls/winebus.sys/bus_udev.c   | 58 ++++++++++++++++++----------
>   dlls/winebus.sys/controller.h | 16 --------
>   3 files changed, 84 insertions(+), 61 deletions(-)
> 
> diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
> index 49ec69965bf..701d5a53825 100644
> --- a/dlls/winebus.sys/bus_sdl.c
> +++ b/dlls/winebus.sys/bus_sdl.c
> @@ -119,6 +119,7 @@ struct platform_private
>       SDL_GameController *sdl_controller;
>       SDL_JoystickID id;
>   
> +    int button_start;
>       int axis_start;
>       int ball_start;
>       int hat_start;
> @@ -247,6 +248,23 @@ static BYTE *add_axis_block(BYTE *report_ptr, BYTE count, BYTE page, const BYTE
>       return report_ptr;
>   }
>   
> +static void set_button_value(struct platform_private *ext, int index, int value)
> +{
> +    int byte_index = ext->button_start + index / 8;
> +    int bit_index = index % 8;
> +    BYTE mask = 1 << bit_index;
> +
> +    if (value)
> +    {
> +        ext->report_buffer[byte_index] = ext->report_buffer[byte_index] | mask;
> +    }
> +    else
> +    {
> +        mask = ~mask;
> +        ext->report_buffer[byte_index] = ext->report_buffer[byte_index] & mask;
> +    }
> +}
> +
>   static void set_axis_value(struct platform_private *ext, int index, short value)
>   {
>       int offset;
> @@ -362,16 +380,6 @@ static BOOL build_report_descriptor(struct platform_private *ext)
>       descript_size = sizeof(REPORT_HEADER) + sizeof(REPORT_TAIL);
>       report_size = 0;
>   
> -    /* For now lump all buttons just into incremental usages, Ignore Keys */
> -    button_count = pSDL_JoystickNumButtons(ext->sdl_joystick);
> -    if (button_count)
> -    {
> -        descript_size += sizeof(REPORT_BUTTONS);
> -        if (button_count % 8)
> -            descript_size += sizeof(REPORT_PADDING);
> -        report_size = (button_count + 7) / 8;
> -    }
> -
>       axis_count = pSDL_JoystickNumAxes(ext->sdl_joystick);
>       if (axis_count > 6)
>       {
> @@ -403,6 +411,17 @@ static BOOL build_report_descriptor(struct platform_private *ext)
>           report_size += (sizeof(WORD) * 2 * ball_count);
>       }
>   
> +    /* For now lump all buttons just into incremental usages, Ignore Keys */
> +    button_count = pSDL_JoystickNumButtons(ext->sdl_joystick);
> +    ext->button_start = report_size;
> +    if (button_count)
> +    {
> +        descript_size += sizeof(REPORT_BUTTONS);
> +        if (button_count % 8)
> +            descript_size += sizeof(REPORT_PADDING);
> +        report_size += (button_count + 7) / 8;
> +    }
> +
>       hat_count = pSDL_JoystickNumHats(ext->sdl_joystick);
>       ext->hat_start = report_size;
>       if (hat_count)
> @@ -428,15 +447,6 @@ static BOOL build_report_descriptor(struct platform_private *ext)
>       report_ptr[IDX_HEADER_PAGE] = device_usage[0];
>       report_ptr[IDX_HEADER_USAGE] = device_usage[1];
>       report_ptr += sizeof(REPORT_HEADER);
> -    if (button_count)
> -    {
> -        report_ptr = add_button_block(report_ptr, 1, button_count);
> -        if (button_count % 8)
> -        {
> -            BYTE padding = 8 - (button_count % 8);
> -            report_ptr = add_padding_block(report_ptr, padding);
> -        }
> -    }
>       if (axis_count)
>       {
>           if (axis_count == 6 && button_count >= 14)
> @@ -449,6 +459,15 @@ static BOOL build_report_descriptor(struct platform_private *ext)
>       {
>           report_ptr = add_axis_block(report_ptr, ball_count * 2, HID_USAGE_PAGE_GENERIC, &joystick_usages[axis_count], FALSE);
>       }
> +    if (button_count)
> +    {
> +        report_ptr = add_button_block(report_ptr, 1, button_count);
> +        if (button_count % 8)
> +        {
> +            BYTE padding = 8 - (button_count % 8);
> +            report_ptr = add_padding_block(report_ptr, padding);
> +        }
> +    }
>       if (hat_count)
>           report_ptr = add_hatswitch(report_ptr, hat_count);
>   
> @@ -480,12 +499,14 @@ static BOOL build_mapped_report_descriptor(struct platform_private *ext)
>       INT i, descript_size;
>   
>       descript_size = sizeof(REPORT_HEADER) + sizeof(REPORT_TAIL);
> -    descript_size += sizeof(CONTROLLER_BUTTONS);
>       descript_size += sizeof(CONTROLLER_AXIS);
>       descript_size += sizeof(CONTROLLER_TRIGGERS);
> +    descript_size += sizeof(CONTROLLER_BUTTONS);
>       descript_size += test_haptic(ext);
>   
> -    ext->axis_start = (CONTROLLER_NUM_BUTTONS + 7) / 8;
> +    ext->axis_start = 0;
> +    ext->button_start = CONTROLLER_NUM_AXES * sizeof(WORD);
> +
>       ext->buffer_length = (CONTROLLER_NUM_BUTTONS + 7) / 8 + CONTROLLER_NUM_AXES * sizeof(WORD);
>   
>       TRACE("Report Descriptor will be %i bytes\n", descript_size);
> @@ -503,12 +524,12 @@ static BOOL build_mapped_report_descriptor(struct platform_private *ext)
>       report_ptr[IDX_HEADER_PAGE] = HID_USAGE_PAGE_GENERIC;
>       report_ptr[IDX_HEADER_USAGE] = HID_USAGE_GENERIC_GAMEPAD;
>       report_ptr += sizeof(REPORT_HEADER);
> -    memcpy(report_ptr, CONTROLLER_BUTTONS, sizeof(CONTROLLER_BUTTONS));
> -    report_ptr += sizeof(CONTROLLER_BUTTONS);
>       memcpy(report_ptr, CONTROLLER_AXIS, sizeof(CONTROLLER_AXIS));
>       report_ptr += sizeof(CONTROLLER_AXIS);
>       memcpy(report_ptr, CONTROLLER_TRIGGERS, sizeof(CONTROLLER_TRIGGERS));
>       report_ptr += sizeof(CONTROLLER_TRIGGERS);
> +    memcpy(report_ptr, CONTROLLER_BUTTONS, sizeof(CONTROLLER_BUTTONS));
> +    report_ptr += sizeof(CONTROLLER_BUTTONS);
>       report_ptr += build_haptic(ext, report_ptr);
>       memcpy(report_ptr, REPORT_TAIL, sizeof(REPORT_TAIL));
>   
> @@ -681,7 +702,7 @@ static BOOL set_report_from_event(SDL_Event *event)
>           {
>               SDL_JoyButtonEvent *ie = &event->jbutton;
>   
> -            set_button_value(ie->button, ie->state, private->report_buffer);
> +            set_button_value(private, ie->button, ie->state);
>   
>               process_hid_report(device, private->report_buffer, private->buffer_length);
>               break;
> @@ -764,7 +785,7 @@ static BOOL set_mapped_report_from_event(SDL_Event *event)
>   
>               if (usage >= 0)
>               {
> -                set_button_value(usage, ie->state, private->report_buffer);
> +                set_button_value(private, usage, ie->state);
>                   process_hid_report(device, private->report_buffer, private->buffer_length);
>               }
>               break;
> diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
> index a2c72406cb7..9baccf6a24b 100644
> --- a/dlls/winebus.sys/bus_udev.c
> +++ b/dlls/winebus.sys/bus_udev.c
> @@ -197,6 +197,7 @@ struct wine_input_private {
>       int report_descriptor_size;
>       BYTE *report_descriptor;
>   
> +    int button_start;
>       BYTE button_map[KEY_MAX];
>       BYTE rel_map[HID_REL_MAX];
>       BYTE hat_map[8];
> @@ -276,6 +277,22 @@ static const BYTE* what_am_I(struct udev_device *dev)
>       return Unknown;
>   }
>   
> +static void set_button_value(int index, int value, BYTE* buffer)
> +{
> +    int bindex = index / 8;
> +    int b = index % 8;
> +    BYTE mask;
> +
> +    mask = 1<<b;
> +    if (value)
> +        buffer[bindex] = buffer[bindex] | mask;
> +    else
> +    {
> +        mask = ~mask;
> +        buffer[bindex] = buffer[bindex] & mask;
> +    }
> +}
> +
>   static void set_abs_axis_value(struct wine_input_private *ext, int code, int value)
>   {
>       int index;
> @@ -403,16 +420,6 @@ static BOOL build_report_descriptor(struct wine_input_private *ext, struct udev_
>       descript_size = sizeof(REPORT_HEADER) + sizeof(REPORT_TAIL);
>       report_size = 0;
>   
> -    /* For now lump all buttons just into incremental usages, Ignore Keys */
> -    button_count = count_buttons(ext->base.device_fd, ext->button_map);
> -    if (button_count)
> -    {
> -        descript_size += sizeof(REPORT_BUTTONS);
> -        if (button_count % 8)
> -            descript_size += sizeof(REPORT_PADDING);
> -        report_size = (button_count + 7) / 8;
> -    }
> -
>       abs_count = 0;
>       memset(abs_pages, 0, sizeof(abs_pages));
>       for (i = 0; i < HID_ABS_MAX; i++)
> @@ -463,6 +470,17 @@ static BOOL build_report_descriptor(struct wine_input_private *ext, struct udev_
>       descript_size += sizeof(REPORT_AXIS_HEADER) * rel_count;
>       descript_size += sizeof(REPORT_REL_AXIS_TAIL) * rel_count;
>   
> +    /* For now lump all buttons just into incremental usages, Ignore Keys */
> +    ext->button_start = report_size;
> +    button_count = count_buttons(ext->base.device_fd, ext->button_map);
> +    if (button_count)
> +    {
> +        descript_size += sizeof(REPORT_BUTTONS);
> +        if (button_count % 8)
> +            descript_size += sizeof(REPORT_PADDING);
> +        report_size += (button_count + 7) / 8;
> +    }
> +
>       hat_count = 0;
>       for (i = ABS_HAT0X; i <=ABS_HAT3X; i+=2)
>           if (test_bit(absbits, i))
> @@ -491,15 +509,6 @@ static BOOL build_report_descriptor(struct wine_input_private *ext, struct udev_
>       report_ptr[IDX_HEADER_PAGE] = device_usage[0];
>       report_ptr[IDX_HEADER_USAGE] = device_usage[1];
>       report_ptr += sizeof(REPORT_HEADER);
> -    if (button_count)
> -    {
> -        report_ptr = add_button_block(report_ptr, 1, button_count);
> -        if (button_count % 8)
> -        {
> -            BYTE padding = 8 - (button_count % 8);
> -            report_ptr = add_padding_block(report_ptr, padding);
> -        }
> -    }
>       if (abs_count)
>       {
>           for (i = 1; i < TOP_ABS_PAGE; i++)
> @@ -528,6 +537,15 @@ static BOOL build_report_descriptor(struct wine_input_private *ext, struct udev_
>               }
>           }
>       }
> +    if (button_count)
> +    {
> +        report_ptr = add_button_block(report_ptr, 1, button_count);
> +        if (button_count % 8)
> +        {
> +            BYTE padding = 8 - (button_count % 8);
> +            report_ptr = add_padding_block(report_ptr, padding);
> +        }
> +    }
>       if (hat_count)
>           report_ptr = add_hatswitch(report_ptr, hat_count);
>   
> @@ -592,7 +610,7 @@ static BOOL set_report_from_event(struct wine_input_private *ext, struct input_e
>               return FALSE;
>   #endif
>           case EV_KEY:
> -            set_button_value(ext->button_map[ie->code], ie->value, ext->current_report_buffer);
> +            set_button_value(ext->button_start + ext->button_map[ie->code], ie->value, ext->current_report_buffer);
>               return FALSE;
>           case EV_ABS:
>               set_abs_axis_value(ext, ie->code, ie->value);
> diff --git a/dlls/winebus.sys/controller.h b/dlls/winebus.sys/controller.h
> index 80e9c786c77..d443d6ca178 100644
> --- a/dlls/winebus.sys/controller.h
> +++ b/dlls/winebus.sys/controller.h
> @@ -113,19 +113,3 @@ static inline BYTE *add_hatswitch(BYTE *report_ptr, INT count)
>       report_ptr[IDX_HATSWITCH_COUNT] = count;
>       return report_ptr + sizeof(REPORT_HATSWITCH);
>   }
> -
> -static inline void set_button_value(int index, int value, BYTE* buffer)
> -{
> -    int bindex = index / 8;
> -    int b = index % 8;
> -    BYTE mask;
> -
> -    mask = 1<<b;
> -    if (value)
> -        buffer[bindex] = buffer[bindex] | mask;
> -    else
> -    {
> -        mask = ~mask;
> -        buffer[bindex] = buffer[bindex] & mask;
> -    }
> -}
> 



More information about the wine-devel mailing list