From ad93f89279233a6adfa0dc0ebe3570c4c614cedb Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Wed, 12 Sep 2018 19:59:18 +0200 Subject: [PATCH] improved clearing event queue after fading and after door/envelope requests This is an improvement of commit ba20bcc8, which totally cleared the event queue after fading and after door/envelope requests, and which prevented entering multiple key presses by intention (like starting the game and immediately going to pause mode with the very first game frame, by quickly pressing "space" twice in the main menu). This change only removes key presses entered by keyboard auto-repeat during fading or door/envelope animations, effectively preventing accidentally entered multiple key events by pressing a key like "space" or "return" a bit too long (which then triggers auto-repeat), while it keeps multiple key events that were manually entered. --- src/-transparent | Bin 0 -> 38 bytes src/events.c | 17 +++++++++++++++++ src/events.h | 1 + src/tools.c | 8 ++++---- 4 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 src/-transparent diff --git a/src/-transparent b/src/-transparent new file mode 100644 index 0000000000000000000000000000000000000000..14a435cdd93ad3413c329490192c54b70ec0b239 GIT binary patch literal 38 OcmZQzU}RuoAOrvajsOGz literal 0 HcmV?d00001 diff --git a/src/events.c b/src/events.c index 8e368b61..b610ff8b 100644 --- a/src/events.c +++ b/src/events.c @@ -347,6 +347,23 @@ void EventLoop(void) } } +void ClearAutoRepeatKeyEvents() +{ + while (PendingEvent()) + { + Event next_event; + + PeekEvent(&next_event); + + /* if event is repeated key press event, remove it from event queue */ + if (next_event.type == EVENT_KEYPRESS && + next_event.key.repeat) + WaitEvent(&next_event); + else + break; + } +} + void ClearEventQueue() { Event event; diff --git a/src/events.h b/src/events.h index 9672029f..2a4228c7 100644 --- a/src/events.h +++ b/src/events.h @@ -18,6 +18,7 @@ boolean NextValidEvent(Event *); void EventLoop(void); void HandleOtherEvents(Event *); +void ClearAutoRepeatKeyEvents(void); void ClearEventQueue(void); void ClearPlayerAction(void); void SleepWhileUnmapped(void); diff --git a/src/tools.c b/src/tools.c index a11f692e..4bd3b8d9 100644 --- a/src/tools.c +++ b/src/tools.c @@ -982,7 +982,7 @@ static void FadeExt(int fade_mask, int fade_mode, int fade_type) redraw_mask &= ~fade_mask; - ClearEventQueue(); + ClearAutoRepeatKeyEvents(); } static void SetScreenStates_BeforeFadingIn() @@ -2803,7 +2803,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) SkipUntilDelayReached(&anim_delay, anim_delay_value, &i, last_frame); } - ClearEventQueue(); + ClearAutoRepeatKeyEvents(); } void ShowEnvelope(int envelope_nr) @@ -3088,7 +3088,7 @@ void AnimateEnvelopeRequest(int anim_mode, int action) SkipUntilDelayReached(&anim_delay, anim_delay_value, &i, last_frame); } - ClearEventQueue(); + ClearAutoRepeatKeyEvents(); } void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) @@ -5429,7 +5429,7 @@ unsigned int MoveDoor(unsigned int door_state) DrawMaskedBorder(REDRAW_DOOR_1); DrawMaskedBorder(REDRAW_DOOR_2); - ClearEventQueue(); + ClearAutoRepeatKeyEvents(); return (door1 | door2); } -- 2.34.1