[PATCH 1/4] winebus.sys: Prefer USAGE_AND_PAGE over BYTE arrays.

Rémi Bernon rbernon at codeweavers.com
Thu Oct 21 03:06:57 CDT 2021


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=40658
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 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




More information about the wine-devel mailing list