hid/hgame: Fix desync in hgame_dpad_cb()
hgame_dpad_cb() previously exited early whenever conflicting directions were input (e.g., UP + DOWN) without saving said input to the hgame_softc state. This led to a desync between the driver and the gamepad. This patch instead handles conflicting inputs by cancelling them out with each other. Remove early return. Calculate axis value by subtraction. Reviewed by: obiwac Approved by: obiwac Differential Revision: https://reviews.freebsd.org/D55849
This commit is contained in:
committed by
Aymeric Wibo
parent
c6bcf6e6fd
commit
c586944fa2
+4
-12
@@ -134,28 +134,20 @@ hgame_dpad_cb(HIDMAP_CB_ARGS)
|
||||
data = ctx.data;
|
||||
switch (HIDMAP_CB_UDATA64) {
|
||||
case HUG_D_PAD_UP:
|
||||
if (sc->dpad_down)
|
||||
return (ENOMSG);
|
||||
evdev_push_abs(evdev, ABS_HAT0Y, (data == 0) ? 0 : -1);
|
||||
sc->dpad_up = (data != 0);
|
||||
evdev_push_abs(evdev, ABS_HAT0Y, sc->dpad_down - sc->dpad_up);
|
||||
break;
|
||||
case HUG_D_PAD_DOWN:
|
||||
if (sc->dpad_up)
|
||||
return (ENOMSG);
|
||||
evdev_push_abs(evdev, ABS_HAT0Y, (data == 0) ? 0 : 1);
|
||||
sc->dpad_down = (data != 0);
|
||||
evdev_push_abs(evdev, ABS_HAT0Y, sc->dpad_down - sc->dpad_up);
|
||||
break;
|
||||
case HUG_D_PAD_RIGHT:
|
||||
if (sc->dpad_left)
|
||||
return (ENOMSG);
|
||||
evdev_push_abs(evdev, ABS_HAT0X, (data == 0) ? 0 : 1);
|
||||
sc->dpad_right = (data != 0);
|
||||
evdev_push_abs(evdev, ABS_HAT0X, sc->dpad_right - sc->dpad_left);
|
||||
break;
|
||||
case HUG_D_PAD_LEFT:
|
||||
if (sc->dpad_right)
|
||||
return (ENOMSG);
|
||||
evdev_push_abs(evdev, ABS_HAT0X, (data == 0) ? 0 : -1);
|
||||
sc->dpad_left = (data != 0);
|
||||
evdev_push_abs(evdev, ABS_HAT0X, sc->dpad_right - sc->dpad_left);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user