From: "Rémi Bernon" Subject: [PATCH 1/4] winebus.sys: Prefer USAGE_AND_PAGE over BYTE arrays. Message-Id: <20211021080700.1024364-1-rbernon@codeweavers.com> Date: Thu, 21 Oct 2021 10:06:57 +0200 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=40658 Signed-off-by: Rémi Bernon --- dlls/winebus.sys/bus_udev.c | 133 +++++++++++++++++------------------- 1 file changed, 63 insertions(+), 70 deletions(-) diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c index c7125520c33..f0651a8e529 100644 --- a/dlls/winebus.sys/bus_udev.c +++ b/dlls/winebus.sys/bus_udev.c @@ -141,15 +141,63 @@ static inline struct hidraw_device *hidraw_impl_from_unix_device(struct unix_dev #ifdef HAS_PROPER_INPUT_HEADER -#define HID_REL_MAX (REL_MISC+1) -#define HID_ABS_MAX (ABS_VOLUME+1) +static const USAGE_AND_PAGE absolute_usages[] = +{ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_X}, /* ABS_X */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Y}, /* ABS_Y */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Z}, /* ABS_Z */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RX}, /* ABS_RX */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RY}, /* ABS_RY */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RZ}, /* ABS_RZ */ + {.UsagePage = HID_USAGE_PAGE_SIMULATION, .Usage = HID_USAGE_SIMULATION_THROTTLE}, /* ABS_THROTTLE */ + {.UsagePage = HID_USAGE_PAGE_SIMULATION, .Usage = HID_USAGE_SIMULATION_RUDDER}, /* ABS_RUDDER */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_WHEEL}, /* ABS_WHEEL */ + {.UsagePage = HID_USAGE_PAGE_SIMULATION, .Usage = HID_USAGE_SIMULATION_ACCELERATOR}, /* ABS_GAS */ + {.UsagePage = HID_USAGE_PAGE_SIMULATION, .Usage = HID_USAGE_SIMULATION_BRAKE}, /* ABS_BRAKE */ + {0}, + {0}, + {0}, + {0}, + {0}, + {0}, /* ABS_HAT0X */ + {0}, /* ABS_HAT0Y */ + {0}, /* ABS_HAT1X */ + {0}, /* ABS_HAT1Y */ + {0}, /* ABS_HAT2X */ + {0}, /* ABS_HAT2Y */ + {0}, /* ABS_HAT3X */ + {0}, /* ABS_HAT3Y */ + {.UsagePage = HID_USAGE_PAGE_DIGITIZER, .Usage = HID_USAGE_DIGITIZER_TIP_PRESSURE}, /* ABS_PRESSURE */ + {0}, /* ABS_DISTANCE */ + {.UsagePage = HID_USAGE_PAGE_DIGITIZER, .Usage = HID_USAGE_DIGITIZER_X_TILT}, /* ABS_TILT_X */ + {.UsagePage = HID_USAGE_PAGE_DIGITIZER, .Usage = HID_USAGE_DIGITIZER_Y_TILT}, /* ABS_TILT_Y */ + {0}, /* ABS_TOOL_WIDTH */ + {0}, + {0}, + {0}, + {.UsagePage = HID_USAGE_PAGE_CONSUMER, .Usage = HID_USAGE_CONSUMER_VOLUME}, /* ABS_VOLUME */ +}; + +static const USAGE_AND_PAGE relative_usages[] = +{ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_X}, /* REL_X */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Y}, /* REL_Y */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Z}, /* REL_Z */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RX}, /* REL_RX */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RY}, /* REL_RY */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RZ}, /* REL_RZ */ + {0}, /* REL_HWHEEL */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_DIAL}, /* REL_DIAL */ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_WHEEL}, /* REL_WHEEL */ + {0}, /* REL_MISC */ +}; struct lnxev_device { struct base_device base; - BYTE abs_map[HID_ABS_MAX]; - BYTE rel_map[HID_REL_MAX]; + BYTE abs_map[ARRAY_SIZE(absolute_usages)]; + BYTE rel_map[ARRAY_SIZE(relative_usages)]; BYTE hat_map[8]; BYTE button_map[KEY_MAX]; @@ -459,58 +507,6 @@ static struct base_device *find_device_from_syspath(const char *path) return NULL; } -static const BYTE ABS_TO_HID_MAP[][2] = { - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_X}, /*ABS_X*/ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_Y}, /*ABS_Y*/ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_Z}, /*ABS_Z*/ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_RX}, /*ABS_RX*/ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_RY}, /*ABS_RY*/ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_RZ}, /*ABS_RZ*/ - {HID_USAGE_PAGE_SIMULATION, HID_USAGE_SIMULATION_THROTTLE}, /*ABS_THROTTLE*/ - {HID_USAGE_PAGE_SIMULATION, HID_USAGE_SIMULATION_RUDDER}, /*ABS_RUDDER*/ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_WHEEL}, /*ABS_WHEEL*/ - {HID_USAGE_PAGE_SIMULATION, HID_USAGE_SIMULATION_ACCELERATOR}, /*ABS_GAS*/ - {HID_USAGE_PAGE_SIMULATION, HID_USAGE_SIMULATION_BRAKE}, /*ABS_BRAKE*/ - {0,0}, - {0,0}, - {0,0}, - {0,0}, - {0,0}, - {0,0}, /*ABS_HAT0X*/ - {0,0}, /*ABS_HAT0Y*/ - {0,0}, /*ABS_HAT1X*/ - {0,0}, /*ABS_HAT1Y*/ - {0,0}, /*ABS_HAT2X*/ - {0,0}, /*ABS_HAT2Y*/ - {0,0}, /*ABS_HAT3X*/ - {0,0}, /*ABS_HAT3Y*/ - {HID_USAGE_PAGE_DIGITIZER, HID_USAGE_DIGITIZER_TIP_PRESSURE}, /*ABS_PRESSURE*/ - {0, 0}, /*ABS_DISTANCE*/ - {HID_USAGE_PAGE_DIGITIZER, HID_USAGE_DIGITIZER_X_TILT}, /*ABS_TILT_X*/ - {HID_USAGE_PAGE_DIGITIZER, HID_USAGE_DIGITIZER_Y_TILT}, /*ABS_TILT_Y*/ - {0, 0}, /*ABS_TOOL_WIDTH*/ - {0, 0}, - {0, 0}, - {0, 0}, - {HID_USAGE_PAGE_CONSUMER, HID_USAGE_CONSUMER_VOLUME} /*ABS_VOLUME*/ -}; -C_ASSERT(ARRAY_SIZE(ABS_TO_HID_MAP) == HID_ABS_MAX); -#define TOP_ABS_PAGE (HID_USAGE_PAGE_DIGITIZER+1) - -static const BYTE REL_TO_HID_MAP[][2] = { - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_X}, /* REL_X */ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_Y}, /* REL_Y */ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_Z}, /* REL_Z */ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_RX}, /* REL_RX */ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_RY}, /* REL_RY */ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_RZ}, /* REL_RZ */ - {0, 0}, /* REL_HWHEEL */ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_DIAL}, /* REL_DIAL */ - {HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_WHEEL}, /* REL_WHEEL */ - {0, 0} /* REL_MISC */ -}; -#define TOP_REL_PAGE (HID_USAGE_PAGE_CONSUMER+1) - #define test_bit(arr,bit) (((BYTE*)(arr))[(bit)>>3]&(1<<((bit)&7))) static const BYTE* what_am_I(struct udev_device *dev) @@ -584,17 +580,17 @@ static INT count_abs_axis(int device_fd) return 0; } - for (i = 0; i < HID_ABS_MAX; i++) + for (i = 0; i < ARRAY_SIZE(absolute_usages); i++) if (test_bit(absbits, i) && - (ABS_TO_HID_MAP[i][1] >= HID_USAGE_GENERIC_X && - ABS_TO_HID_MAP[i][1] <= HID_USAGE_GENERIC_WHEEL)) + (absolute_usages[i].Usage >= HID_USAGE_GENERIC_X && + absolute_usages[i].Usage <= HID_USAGE_GENERIC_WHEEL)) abs_count++; return abs_count; } static NTSTATUS build_report_descriptor(struct unix_device *iface, struct udev_device *dev) { - struct input_absinfo abs_info[HID_ABS_MAX]; + struct input_absinfo abs_info[ARRAY_SIZE(absolute_usages)]; BYTE absbits[(ABS_MAX+7)/8]; BYTE relbits[(REL_MAX+7)/8]; BYTE ffbits[(FF_MAX+7)/8]; @@ -629,14 +625,12 @@ static NTSTATUS build_report_descriptor(struct unix_device *iface, struct udev_d return STATUS_NO_MEMORY; abs_count = 0; - for (i = 0; i < HID_ABS_MAX; i++) + for (i = 0; i < ARRAY_SIZE(absolute_usages); i++) { + usage = absolute_usages[i]; if (!test_bit(absbits, i)) continue; ioctl(impl->base.device_fd, EVIOCGABS(i), abs_info + i); - - if (!(usage.UsagePage = ABS_TO_HID_MAP[i][0])) continue; - if (!(usage.Usage = ABS_TO_HID_MAP[i][1])) continue; - + if (!usage.UsagePage || !usage.Usage) continue; if (!hid_device_add_axes(iface, 1, usage.UsagePage, &usage.Usage, FALSE, LE_DWORD(abs_info[i].minimum), LE_DWORD(abs_info[i].maximum))) return STATUS_NO_MEMORY; @@ -645,12 +639,11 @@ static NTSTATUS build_report_descriptor(struct unix_device *iface, struct udev_d } rel_count = 0; - for (i = 0; i < HID_REL_MAX; i++) + for (i = 0; i < ARRAY_SIZE(relative_usages); i++) { + usage = relative_usages[i]; if (!test_bit(relbits, i)) continue; - if (!(usage.UsagePage = REL_TO_HID_MAP[i][0])) continue; - if (!(usage.Usage = REL_TO_HID_MAP[i][1])) continue; - + if (!usage.UsagePage || !usage.Usage) continue; if (!hid_device_add_axes(iface, 1, usage.UsagePage, &usage.Usage, TRUE, INT32_MIN, INT32_MAX)) return STATUS_NO_MEMORY; @@ -719,7 +712,7 @@ static NTSTATUS build_report_descriptor(struct unix_device *iface, struct udev_d return STATUS_NO_MEMORY; /* Initialize axis in the report */ - for (i = 0; i < HID_ABS_MAX; i++) + for (i = 0; i < ARRAY_SIZE(absolute_usages); i++) { if (!test_bit(absbits, i)) continue; if (i < ABS_HAT0X || i > ABS_HAT3Y) -- 2.33.0