[PATCH 2/5] winebus.sys: Factor out setting HID report values.
Rémi Bernon
rbernon at codeweavers.com
Thu Sep 23 01:55:27 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/winebus.sys/bus_sdl.c | 141 ++++++++---------------------
dlls/winebus.sys/bus_udev.c | 154 +++++++++-----------------------
dlls/winebus.sys/hid.c | 87 ++++++++++++++++++
dlls/winebus.sys/unix_private.h | 6 ++
4 files changed, 172 insertions(+), 216 deletions(-)
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index 6adb0fe913d..7af5f13bcee 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -50,12 +50,6 @@
#include "wine/unicode.h"
#include "hidusage.h"
-#ifdef WORDS_BIGENDIAN
-# define LE_DWORD(x) RtlUlongByteSwap(x)
-#else
-# define LE_DWORD(x) (x)
-#endif
-
#include "unix_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
@@ -142,64 +136,23 @@ static struct sdl_device *find_device_from_id(SDL_JoystickID id)
return NULL;
}
-static void set_button_value(struct sdl_device *impl, int index, int value)
-{
- struct hid_device_state *state = &impl->unix_device.hid_device_state;
- USHORT offset = state->button_start;
- int byte_index = offset + index / 8;
- int bit_index = index % 8;
- BYTE mask = 1 << bit_index;
- if (index >= state->button_count) return;
- if (value) state->report_buf[byte_index] |= mask;
- else state->report_buf[byte_index] &= ~mask;
-}
-
-static void set_axis_value(struct sdl_device *impl, int index, short value)
+static void set_hat_value(struct unix_device *iface, int index, int value)
{
- struct hid_device_state *state = &impl->unix_device.hid_device_state;
- USHORT offset = state->abs_axis_start;
- if (index >= state->abs_axis_count) return;
- offset += index * sizeof(DWORD);
- *(DWORD *)&state->report_buf[offset] = LE_DWORD(value);
-}
-
-static void set_ball_value(struct sdl_device *impl, int index, int value1, int value2)
-{
- struct hid_device_state *state = &impl->unix_device.hid_device_state;
- USHORT offset = state->rel_axis_start;
- if (index >= state->rel_axis_count) return;
- offset += index * sizeof(DWORD);
- *(DWORD *)&state->report_buf[offset] = LE_DWORD(value1);
- *(DWORD *)&state->report_buf[offset + sizeof(DWORD)] = LE_DWORD(value2);
-}
-
-static void set_hat_value(struct sdl_device *impl, int index, int value)
-{
- struct hid_device_state *state = &impl->unix_device.hid_device_state;
- USHORT offset = state->hatswitch_start;
- unsigned char val;
-
- if (index >= state->hatswitch_count) return;
- offset += index;
-
+ LONG x = 0, y = 0;
switch (value)
{
- /* 8 1 2
- * 7 0 3
- * 6 5 4 */
- case SDL_HAT_CENTERED: val = 0; break;
- case SDL_HAT_UP: val = 1; break;
- case SDL_HAT_RIGHTUP: val = 2; break;
- case SDL_HAT_RIGHT: val = 3; break;
- case SDL_HAT_RIGHTDOWN: val = 4; break;
- case SDL_HAT_DOWN: val = 5; break;
- case SDL_HAT_LEFTDOWN: val = 6; break;
- case SDL_HAT_LEFT: val = 7; break;
- case SDL_HAT_LEFTUP: val = 8; break;
- default: return;
+ case SDL_HAT_CENTERED: break;
+ case SDL_HAT_UP: y = 1; break;
+ case SDL_HAT_RIGHTUP: y = x = 1; break;
+ case SDL_HAT_RIGHT: x = 1; break;
+ case SDL_HAT_RIGHTDOWN: x = 1; y = -1; break;
+ case SDL_HAT_DOWN: y = -1; break;
+ case SDL_HAT_LEFTDOWN: x = y = -1; break;
+ case SDL_HAT_LEFT: x = -1; break;
+ case SDL_HAT_LEFTUP: x = -1; y = 1; break;
}
-
- state->report_buf[offset] = val;
+ hid_device_set_hatswitch_x(iface, index, x);
+ hid_device_set_hatswitch_y(iface, index, y);
}
static BOOL descriptor_add_haptic(struct sdl_device *impl)
@@ -286,40 +239,13 @@ static NTSTATUS build_joystick_report_descriptor(struct unix_device *iface)
/* Initialize axis in the report */
for (i = 0; i < axis_count; i++)
- set_axis_value(impl, i, pSDL_JoystickGetAxis(impl->sdl_joystick, i));
+ hid_device_set_abs_axis(iface, i, pSDL_JoystickGetAxis(impl->sdl_joystick, i));
for (i = 0; i < hat_count; i++)
- set_hat_value(impl, i, pSDL_JoystickGetHat(impl->sdl_joystick, i));
+ set_hat_value(iface, i, pSDL_JoystickGetHat(impl->sdl_joystick, i));
return STATUS_SUCCESS;
}
-static SHORT compose_dpad_value(SDL_GameController *joystick)
-{
- if (pSDL_GameControllerGetButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_UP))
- {
- if (pSDL_GameControllerGetButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_RIGHT))
- return SDL_HAT_RIGHTUP;
- if (pSDL_GameControllerGetButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_LEFT))
- return SDL_HAT_LEFTUP;
- return SDL_HAT_UP;
- }
-
- if (pSDL_GameControllerGetButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_DOWN))
- {
- if (pSDL_GameControllerGetButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_RIGHT))
- return SDL_HAT_RIGHTDOWN;
- if (pSDL_GameControllerGetButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_LEFT))
- return SDL_HAT_LEFTDOWN;
- return SDL_HAT_DOWN;
- }
-
- if (pSDL_GameControllerGetButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_RIGHT))
- return SDL_HAT_RIGHT;
- if (pSDL_GameControllerGetButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_LEFT))
- return SDL_HAT_LEFT;
- return SDL_HAT_CENTERED;
-}
-
static NTSTATUS build_controller_report_descriptor(struct unix_device *iface)
{
static const USAGE left_axis_usages[] = {HID_USAGE_GENERIC_X, HID_USAGE_GENERIC_Y};
@@ -358,8 +284,15 @@ static NTSTATUS build_controller_report_descriptor(struct unix_device *iface)
/* Initialize axis in the report */
for (i = SDL_CONTROLLER_AXIS_LEFTX; i < SDL_CONTROLLER_AXIS_MAX; i++)
- set_axis_value(impl, i, pSDL_GameControllerGetAxis(impl->sdl_controller, i));
- set_hat_value(impl, 0, compose_dpad_value(impl->sdl_controller));
+ hid_device_set_abs_axis(iface, i, pSDL_GameControllerGetAxis(impl->sdl_controller, i));
+ if (pSDL_GameControllerGetButton(impl->sdl_controller, SDL_CONTROLLER_BUTTON_DPAD_UP))
+ hid_device_set_hatswitch_y(iface, 0, -1);
+ if (pSDL_GameControllerGetButton(impl->sdl_controller, SDL_CONTROLLER_BUTTON_DPAD_DOWN))
+ hid_device_set_hatswitch_y(iface, 0, +1);
+ if (pSDL_GameControllerGetButton(impl->sdl_controller, SDL_CONTROLLER_BUTTON_DPAD_LEFT))
+ hid_device_set_hatswitch_x(iface, 0, -1);
+ if (pSDL_GameControllerGetButton(impl->sdl_controller, SDL_CONTROLLER_BUTTON_DPAD_RIGHT))
+ hid_device_set_hatswitch_x(iface, 0, +1);
return STATUS_SUCCESS;
}
@@ -471,7 +404,7 @@ static BOOL set_report_from_joystick_event(struct sdl_device *impl, SDL_Event *e
{
SDL_JoyButtonEvent *ie = &event->jbutton;
- set_button_value(impl, ie->button, ie->state);
+ hid_device_set_button(iface, ie->button, ie->state);
bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len);
break;
}
@@ -479,18 +412,16 @@ static BOOL set_report_from_joystick_event(struct sdl_device *impl, SDL_Event *e
{
SDL_JoyAxisEvent *ie = &event->jaxis;
- if (ie->axis < 6)
- {
- set_axis_value(impl, ie->axis, ie->value);
- bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len);
- }
+ hid_device_set_abs_axis(iface, ie->axis, ie->value);
+ bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len);
break;
}
case SDL_JOYBALLMOTION:
{
SDL_JoyBallEvent *ie = &event->jball;
- set_ball_value(impl, ie->ball, ie->xrel, ie->yrel);
+ hid_device_set_rel_axis(iface, 2 * ie->ball, ie->xrel);
+ hid_device_set_rel_axis(iface, 2 * ie->ball + 1, ie->yrel);
bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len);
break;
}
@@ -498,7 +429,7 @@ static BOOL set_report_from_joystick_event(struct sdl_device *impl, SDL_Event *e
{
SDL_JoyHatEvent *ie = &event->jhat;
- set_hat_value(impl, ie->hat, ie->value);
+ set_hat_value(iface, ie->hat, ie->value);
bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len);
break;
}
@@ -524,10 +455,16 @@ static BOOL set_report_from_controller_event(struct sdl_device *impl, SDL_Event
switch ((button = ie->button))
{
case SDL_CONTROLLER_BUTTON_DPAD_UP:
+ hid_device_set_hatswitch_y(iface, 0, ie->state ? -1 : 0);
+ break;
case SDL_CONTROLLER_BUTTON_DPAD_DOWN:
+ hid_device_set_hatswitch_y(iface, 0, ie->state ? +1 : 0);
+ break;
case SDL_CONTROLLER_BUTTON_DPAD_LEFT:
+ hid_device_set_hatswitch_x(iface, 0, ie->state ? -1 : 0);
+ break;
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
- set_hat_value(impl, 0, compose_dpad_value(impl->sdl_controller));
+ hid_device_set_hatswitch_x(iface, 0, ie->state ? +1 : 0);
break;
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: button = 4; break;
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: button = 5; break;
@@ -538,7 +475,7 @@ static BOOL set_report_from_controller_event(struct sdl_device *impl, SDL_Event
case SDL_CONTROLLER_BUTTON_GUIDE: button = 10; break;
}
- set_button_value(impl, button, ie->state);
+ hid_device_set_button(iface, button, ie->state);
bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len);
break;
}
@@ -546,7 +483,7 @@ static BOOL set_report_from_controller_event(struct sdl_device *impl, SDL_Event
{
SDL_ControllerAxisEvent *ie = &event->caxis;
- set_axis_value(impl, ie->axis, ie->value);
+ hid_device_set_abs_axis(iface, ie->axis, ie->value);
bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len);
break;
}
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index cd7eadf7ec0..f4d27090109 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -126,7 +126,6 @@ struct lnxev_device
BYTE rel_map[HID_REL_MAX];
BYTE hat_map[8];
BYTE button_map[KEY_MAX];
- int hat_values[8];
};
static inline struct base_device *impl_from_unix_device(struct unix_device *iface)
@@ -325,89 +324,6 @@ static const BYTE* what_am_I(struct udev_device *dev)
return Unknown;
}
-static void set_button_value(struct lnxev_device *impl, int index, int value)
-{
- struct hid_device_state *state = &impl->base.unix_device.hid_device_state;
- USHORT offset = state->button_start;
- int byte_index = offset + index / 8;
- int bit_index = index % 8;
- BYTE mask = 1 << bit_index;
- if (index >= state->button_count) return;
- if (value) state->report_buf[byte_index] |= mask;
- else state->report_buf[byte_index] &= ~mask;
-}
-
-static void set_abs_axis_value(struct lnxev_device *impl, int code, int value)
-{
- struct hid_device_state *state = &impl->base.unix_device.hid_device_state;
- USHORT offset, index;
- /* check for hatswitches */
- if (code <= ABS_HAT3Y && code >= ABS_HAT0X)
- {
- index = code - ABS_HAT0X;
- impl->hat_values[index] = value;
- if ((code - ABS_HAT0X) % 2)
- index--;
- /* 8 1 2
- * 7 0 3
- * 6 5 4 */
- if (impl->hat_values[index] == 0)
- {
- if (impl->hat_values[index+1] == 0)
- value = 0;
- else if (impl->hat_values[index+1] < 0)
- value = 1;
- else
- value = 5;
- }
- else if (impl->hat_values[index] > 0)
- {
- if (impl->hat_values[index+1] == 0)
- value = 3;
- else if (impl->hat_values[index+1] < 0)
- value = 2;
- else
- value = 4;
- }
- else
- {
- if (impl->hat_values[index+1] == 0)
- value = 7;
- else if (impl->hat_values[index+1] < 0)
- value = 8;
- else
- value = 6;
- }
- index = impl->hat_map[index];
- offset = state->hatswitch_start;
- if (index >= state->hatswitch_count) return;
- offset += index;
- state->report_buf[offset] = value;
- }
- else if (code < HID_ABS_MAX && ABS_TO_HID_MAP[code][0] != 0)
- {
- index = impl->abs_map[code];
- offset = state->abs_axis_start;
- if (index >= state->abs_axis_count) return;
- offset += index * sizeof(DWORD);
- *(DWORD *)&state->report_buf[offset] = LE_DWORD(value);
- }
-}
-
-static void set_rel_axis_value(struct lnxev_device *impl, int code, int value)
-{
- struct hid_device_state *state = &impl->base.unix_device.hid_device_state;
- USHORT offset, index;
- if (code < HID_REL_MAX && REL_TO_HID_MAP[code][0] != 0)
- {
- index = impl->rel_map[code];
- offset = state->rel_axis_start;
- if (index >= state->rel_axis_count) return;
- offset += index * sizeof(DWORD);
- *(DWORD *)&state->report_buf[offset] = LE_DWORD(value);
- }
-}
-
static INT count_buttons(int device_fd, BYTE *map)
{
int i;
@@ -506,12 +422,11 @@ static NTSTATUS build_report_descriptor(struct unix_device *iface, struct udev_d
}
hat_count = 0;
- for (i = ABS_HAT0X; i <=ABS_HAT3X; i+=2)
+ for (i = ABS_HAT0X; i <= ABS_HAT3X; i += 2)
{
if (!test_bit(absbits, i)) continue;
- impl->hat_map[i - ABS_HAT0X] = hat_count++;
- impl->hat_values[i - ABS_HAT0X] = 0;
- impl->hat_values[i - ABS_HAT0X + 1] = 0;
+ impl->hat_map[i - ABS_HAT0X] = hat_count;
+ impl->hat_map[i - ABS_HAT0X + 1] = hat_count++;
}
if (hat_count && !hid_device_add_hatswitch(iface, hat_count))
@@ -527,8 +442,15 @@ static NTSTATUS build_report_descriptor(struct unix_device *iface, struct udev_d
/* Initialize axis in the report */
for (i = 0; i < HID_ABS_MAX; i++)
- if (test_bit(absbits, i))
- set_abs_axis_value(impl, i, abs_info[i].value);
+ {
+ if (!test_bit(absbits, i)) continue;
+ if (i < ABS_HAT0X || i > ABS_HAT3Y)
+ hid_device_set_abs_axis(iface, impl->abs_map[i], abs_info[i].value);
+ else if ((i - ABS_HAT0X) % 2)
+ hid_device_set_hatswitch_y(iface, impl->hat_map[i - ABS_HAT0X], abs_info[i].value);
+ else
+ hid_device_set_hatswitch_x(iface, impl->hat_map[i - ABS_HAT0X], abs_info[i].value);
+ }
return STATUS_SUCCESS;
}
@@ -536,33 +458,39 @@ static NTSTATUS build_report_descriptor(struct unix_device *iface, struct udev_d
static BOOL set_report_from_event(struct unix_device *iface, struct input_event *ie)
{
struct lnxev_device *impl = lnxev_impl_from_unix_device(iface);
- switch(ie->type)
+
+ switch (ie->type)
{
#ifdef EV_SYN
- case EV_SYN:
- switch (ie->code)
- {
- case SYN_REPORT: return hid_device_sync_report(iface);
- case SYN_DROPPED: hid_device_drop_report(iface); break;
- }
- return FALSE;
+ case EV_SYN:
+ switch (ie->code)
+ {
+ case SYN_REPORT: return hid_device_sync_report(iface);
+ case SYN_DROPPED: hid_device_drop_report(iface); break;
+ }
+ return FALSE;
#endif
#ifdef EV_MSC
- case EV_MSC:
- return FALSE;
+ case EV_MSC:
+ return FALSE;
#endif
- case EV_KEY:
- set_button_value(impl, impl->button_map[ie->code], ie->value);
- return FALSE;
- case EV_ABS:
- set_abs_axis_value(impl, ie->code, ie->value);
- return FALSE;
- case EV_REL:
- set_rel_axis_value(impl, ie->code, ie->value);
- return FALSE;
- default:
- ERR("TODO: Process Report (%i, %i)\n",ie->type, ie->code);
- return FALSE;
+ case EV_KEY:
+ hid_device_set_button(iface, impl->button_map[ie->code], ie->value);
+ return FALSE;
+ case EV_ABS:
+ if (ie->code < ABS_HAT0X || ie->code > ABS_HAT3Y)
+ hid_device_set_abs_axis(iface, impl->abs_map[ie->code], ie->value);
+ else if ((ie->code - ABS_HAT0X) % 2)
+ hid_device_set_hatswitch_y(iface, impl->hat_map[ie->code - ABS_HAT0X], ie->value);
+ else
+ hid_device_set_hatswitch_x(iface, impl->hat_map[ie->code - ABS_HAT0X], ie->value);
+ return FALSE;
+ case EV_REL:
+ hid_device_set_rel_axis(iface, impl->rel_map[ie->code], ie->value);
+ return FALSE;
+ default:
+ ERR("TODO: Process Report (%i, %i)\n",ie->type, ie->code);
+ return FALSE;
}
}
#endif
@@ -791,8 +719,6 @@ static void lnxev_device_read_report(struct unix_device *iface)
struct input_event ie;
int size;
- if (!state->report_buf || !state->report_len) return;
-
size = read(impl->base.device_fd, &ie, sizeof(ie));
if (size == -1)
TRACE_(hid_report)("Read failed. Likely an unplugged device\n");
diff --git a/dlls/winebus.sys/hid.c b/dlls/winebus.sys/hid.c
index ba49c010532..4a4295b9aa8 100644
--- a/dlls/winebus.sys/hid.c
+++ b/dlls/winebus.sys/hid.c
@@ -369,6 +369,93 @@ void *hid_device_create(const struct hid_device_vtbl *vtbl, SIZE_T size)
return impl;
}
+#ifdef WORDS_BIGENDIAN
+# define LE_ULONG(x) RtlUlongByteSwap((ULONG)(x))
+#else
+# define LE_ULONG(x) ((ULONG)(x))
+#endif
+
+BOOL hid_device_set_abs_axis(struct unix_device *iface, ULONG index, LONG value)
+{
+ struct hid_device_state *state = &iface->hid_device_state;
+ ULONG offset = state->abs_axis_start + index * 4;
+ if (index > state->abs_axis_count) return FALSE;
+ *(ULONG *)(state->report_buf + offset) = LE_ULONG(value);
+ return TRUE;
+}
+
+BOOL hid_device_set_rel_axis(struct unix_device *iface, ULONG index, LONG value)
+{
+ struct hid_device_state *state = &iface->hid_device_state;
+ ULONG offset = state->rel_axis_start + index * 4;
+ if (index > state->rel_axis_count) return FALSE;
+ *(ULONG *)(state->report_buf + offset) = LE_ULONG(value);
+ return TRUE;
+}
+
+BOOL hid_device_set_button(struct unix_device *iface, ULONG index, BOOL is_set)
+{
+ struct hid_device_state *state = &iface->hid_device_state;
+ ULONG offset = state->button_start + (index / 8);
+ BYTE mask = (1 << (index % 8));
+ if (index > state->button_count) return FALSE;
+ if (is_set) state->report_buf[offset] |= mask;
+ else state->report_buf[offset] &= ~mask;
+ return TRUE;
+}
+
+/* hatswitch x / y vs value:
+ * -1 x +1
+ * +-------->
+ * -1 | 8 1 2
+ * y | 7 0 3
+ * +1 | 6 5 4
+ * v
+ */
+static void hatswitch_decompose(BYTE value, LONG *x, LONG *y)
+{
+ *x = *y = 0;
+ if (value == 8 || value == 1 || value == 2) *y = -1;
+ if (value == 6 || value == 5 || value == 4) *y = +1;
+ if (value == 8 || value == 7 || value == 6) *x = -1;
+ if (value == 2 || value == 3 || value == 4) *x = +1;
+}
+
+static void hatswitch_compose(LONG x, LONG y, BYTE *value)
+{
+ if (x == 0 && y == 0) *value = 0;
+ else if (x == 0 && y < 0) *value = 1;
+ else if (x > 0 && y < 0) *value = 2;
+ else if (x > 0 && y == 0) *value = 3;
+ else if (x > 0 && y > 0) *value = 4;
+ else if (x == 0 && y > 0) *value = 5;
+ else if (x < 0 && y > 0) *value = 6;
+ else if (x < 0 && y == 0) *value = 7;
+ else if (x < 0 && y < 0) *value = 8;
+}
+
+BOOL hid_device_set_hatswitch_x(struct unix_device *iface, ULONG index, LONG new_x)
+{
+ struct hid_device_state *state = &iface->hid_device_state;
+ ULONG offset = state->hatswitch_start + index;
+ LONG x, y;
+ if (index > state->hatswitch_count) return FALSE;
+ hatswitch_decompose(state->report_buf[offset], &x, &y);
+ hatswitch_compose(new_x, y, &state->report_buf[offset]);
+ return TRUE;
+}
+
+BOOL hid_device_set_hatswitch_y(struct unix_device *iface, ULONG index, LONG new_y)
+{
+ struct hid_device_state *state = &iface->hid_device_state;
+ ULONG offset = state->hatswitch_start + index;
+ LONG x, y;
+ if (index > state->hatswitch_count) return FALSE;
+ hatswitch_decompose(state->report_buf[offset], &x, &y);
+ hatswitch_compose(x, new_y, &state->report_buf[offset]);
+ return TRUE;
+}
+
BOOL hid_device_sync_report(struct unix_device *iface)
{
BOOL dropped;
diff --git a/dlls/winebus.sys/unix_private.h b/dlls/winebus.sys/unix_private.h
index dbec779c67e..543bfda9d79 100644
--- a/dlls/winebus.sys/unix_private.h
+++ b/dlls/winebus.sys/unix_private.h
@@ -119,6 +119,12 @@ extern BOOL hid_device_add_axes(struct unix_device *iface, BYTE count, USAGE usa
extern BOOL hid_device_add_haptics(struct unix_device *iface) DECLSPEC_HIDDEN;
+extern BOOL hid_device_set_abs_axis(struct unix_device *iface, ULONG index, LONG value) DECLSPEC_HIDDEN;
+extern BOOL hid_device_set_rel_axis(struct unix_device *iface, ULONG index, LONG value) DECLSPEC_HIDDEN;
+extern BOOL hid_device_set_button(struct unix_device *iface, ULONG index, BOOL is_set) DECLSPEC_HIDDEN;
+extern BOOL hid_device_set_hatswitch_x(struct unix_device *iface, ULONG index, LONG new_x) DECLSPEC_HIDDEN;
+extern BOOL hid_device_set_hatswitch_y(struct unix_device *iface, ULONG index, LONG new_y) DECLSPEC_HIDDEN;
+
extern BOOL hid_device_sync_report(struct unix_device *iface) DECLSPEC_HIDDEN;
extern void hid_device_drop_report(struct unix_device *iface) DECLSPEC_HIDDEN;
--
2.33.0
More information about the wine-devel
mailing list