[BugFix] YesNo screen wait for button release on exit

if you run yesno screens back to back or another screen with
wait_for_release you may never see the release

instead clear anything in the queue but release events

Change-Id: I1b1e42cbb44f2fdfed441ab1f217b6ea4fe07492
This commit is contained in:
William Wilgus 2025-01-15 11:50:53 -05:00 committed by William Wilgus
parent e5690803c6
commit 54333536fe
4 changed files with 16 additions and 1 deletions

View file

@ -1204,6 +1204,7 @@ void action_wait_for_release(void)
{
if (!(action_last.button & BUTTON_REL))
action_last.wait_for_release = true;
button_clear_pressed();
}
int get_action(int context, int timeout)

View file

@ -253,7 +253,6 @@ enum yesno_res gui_syncyesno_run_w_tmo(int ticks, enum yesno_res tmo_default_res
/* make sure to eat any extranous keypresses */
action_wait_for_release();
button_clear_queue();
/* hook into UI update events to avoid the dialog disappearing
* in case the skin decides to do a full refresh */

View file

@ -185,6 +185,20 @@ void button_clear_queue(void)
queue_clear(&button_queue);
}
/* clears anything but release and sysevents */
void button_clear_pressed(void)
{
long button;
for (int count = queue_count(&button_queue); count > 0; count--)
{
button = button_get(false);
if (button & (BUTTON_REL | SYS_EVENT))
{
button_queue_post(button, button_data);
}
}
}
long button_get_w_tmo(int ticks)
{
struct queue_event ev;

View file

@ -71,6 +71,7 @@ int button_queue_count(void);
bool button_queue_empty(void);
bool button_queue_full(void);
void button_clear_queue(void);
void button_clear_pressed(void);
long button_get(bool block);
long button_get_w_tmo(int ticks);
intptr_t button_get_data(void);