From 97aa8b2f63cbd4c210d20264f57bae3e342b14d4 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Fri, 22 Mar 2019 00:05:57 +0100 Subject: [PATCH] fixed inconsistent global animation state after event actions When executing event actions for global animations, these actions may cause a screen change, which itself may change the state of global animations (especially stopping animations that were running on the previous screen). When executing event actions directly from the functions that handle global animations, these functions may continue changing the state of the global animation that caused the event action, even though this animation was already stopped due to a screen change, which may cause this animation to be set back to "active" ("running") state, so that it continues being displayed on the new screen, even though it was never defined for it. This problem was fixed by executing all event actions independently from the animation handling functions, by inserting new user events into the program's standard event queue, to handle animation event actions in a separate, independent step after all animations were handled. --- src/anim.c | 6 ++---- src/events.c | 8 ++++++++ src/events.h | 5 +++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/anim.c b/src/anim.c index 71f99588..6fe1cb6d 100644 --- a/src/anim.c +++ b/src/anim.c @@ -1638,15 +1638,13 @@ static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part) if (anim_event_action == -1) return FALSE; - boolean action_executed = (DoGadgetAction(anim_event_action) || - DoScreenAction(anim_event_action) || - DoKeysymAction(anim_event_action)); + PushUserEvent(USEREVENT_ANIM_EVENT_ACTION, anim_event_action, 0); // check if further actions are allowed to be executed if (part->control_info.style & STYLE_MULTIPLE_ACTIONS) return FALSE; - return action_executed; + return TRUE; } static void InitGlobalAnim_Clickable(void) diff --git a/src/events.c b/src/events.c index 11fd28f4..17f528e9 100644 --- a/src/events.c +++ b/src/events.c @@ -1607,6 +1607,14 @@ void HandleUserEvent(UserEvent *event) { switch (event->code) { + case USEREVENT_ANIM_EVENT_ACTION: + // execute action functions until matching action was found + if (DoKeysymAction(event->value1) || + DoGadgetAction(event->value1) || + DoScreenAction(event->value1)) + return; + break; + default: break; } diff --git a/src/events.h b/src/events.h index ef61b605..deba7439 100644 --- a/src/events.h +++ b/src/events.h @@ -14,6 +14,11 @@ #include "main.h" + +#define USEREVENT_NONE 0 +#define USEREVENT_ANIM_EVENT_ACTION 1 + + boolean NextValidEvent(Event *); void EventLoop(void); -- 2.34.1