From 89f8dfce096240f0f1a637f002936f2665f1e2fa Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Thu, 19 May 2022 16:47:47 +0900 Subject: [PATCH] [input] Clear button inputs when IN_ClearStates called This fixes the annoying persistence of inputs when respawning and changing levels. Axis input clearing is hooked up but does nothing as of yet. Active device input clearing has always been hooked up, but also does nothing in the evdev and x11 drivers. --- include/QF/input/binding.h | 2 ++ libs/input/in_axis.c | 12 ++++++++++++ libs/input/in_button.c | 13 +++++++++++++ libs/input/in_common.c | 2 ++ 4 files changed, 29 insertions(+) diff --git a/include/QF/input/binding.h b/include/QF/input/binding.h index e901b47a2..a81f8a05c 100644 --- a/include/QF/input/binding.h +++ b/include/QF/input/binding.h @@ -351,7 +351,9 @@ void IN_ButtonAction (in_button_t *buttin, int id, int pressed); int IN_RegisterButton (in_button_t *button); int IN_RegisterAxis (in_axis_t *axis); in_button_t *IN_FindButton (const char *name); +void IN_ButtonClearStates (void); in_axis_t *IN_FindAxis (const char *name); +void IN_AxisClearStates (void); void IN_ButtonAddListener (in_button_t *button, button_listener_t listener, void *data); void IN_ButtonRemoveListener (in_button_t *button, button_listener_t listener, diff --git a/libs/input/in_axis.c b/libs/input/in_axis.c index 303cc75ea..0c250b4ce 100644 --- a/libs/input/in_axis.c +++ b/libs/input/in_axis.c @@ -75,6 +75,18 @@ IN_FindAxis (const char *name) return Hash_Find (axis_tab, name); } +static void +axis_clear_state (void *_a, void *data) +{ + //FIXME what to do here? +} + +void +IN_AxisClearStates (void) +{ + Hash_ForEach (axis_tab, axis_clear_state, 0); +} + void IN_AxisAddListener (in_axis_t *axis, axis_listener_t listener, void *data) { diff --git a/libs/input/in_button.c b/libs/input/in_button.c index 97e4339ad..4847783eb 100644 --- a/libs/input/in_button.c +++ b/libs/input/in_button.c @@ -227,6 +227,19 @@ IN_ButtonRemoveListener (in_button_t *button, button_listener_t listener, } } +static void +button_clear_state (void *_rb, void *data) +{ + regbutton_t *rb = _rb; + button_release_cmd (rb->button); +} + +void +IN_ButtonClearStates (void) +{ + Hash_ForEach (button_tab, button_clear_state, 0); +} + static void in_button_shutdown (void *data) { diff --git a/libs/input/in_common.c b/libs/input/in_common.c index 9d9920641..f4024c753 100644 --- a/libs/input/in_common.c +++ b/libs/input/in_common.c @@ -587,6 +587,8 @@ IN_ClearStates (void) rd->driver.clear_states (rd->data); } } + IN_AxisClearStates (); + IN_ButtonClearStates (); } #ifdef HAVE_EVDEV