fixed handling global animation click events (finally)
authorHolger Schemel <info@artsoft.org>
Fri, 31 May 2019 11:53:17 +0000 (13:53 +0200)
committerHolger Schemel <info@artsoft.org>
Fri, 31 May 2019 12:03:00 +0000 (14:03 +0200)
Also see commit 4be294f9, which did not fix the problem in all cases,
because the next part of a multi-part global animation (activated by
a click event) will not be active before the following game frame, so
a directly following release event would still just be ignored.

Stopping processing of all following events for one game frame after
handling a click event lets the animation successfully change to the
next part, which can then be triggered by the release event.

An example where this might happen is mentioned in the above commit.

src/anim.c
src/events.c
src/events.h

index d5b3d74a7fe36163cb25939413f9dacf8c93b82d..1e155f9eeacec35859e67fc38087bb8a54f8cb30 100644 (file)
@@ -1866,6 +1866,9 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
     HandleGlobalAnim(ANIM_CONTINUE, game_status);
 
     handle_click = FALSE;
+
+    // prevent ignoring release event if processed within same game frame
+    StopProcessingEvents();
   }
 
   return (click_consumed || any_event_action);
index f6442956645825d6ac8e1e1cdcd970e01fe64397..1e39b67bc57a7489beb9c78376d3a11486e65564 100644 (file)
@@ -40,6 +40,7 @@ static unsigned int special_cursor_delay = 0;
 static unsigned int special_cursor_delay_value = 1000;
 
 static boolean virtual_button_pressed = FALSE;
+static boolean stop_processing_events = FALSE;
 
 
 // forward declarations for internal use
@@ -182,6 +183,11 @@ boolean NextValidEvent(Event *event)
   return FALSE;
 }
 
+void StopProcessingEvents(void)
+{
+  stop_processing_events = TRUE;
+}
+
 static void HandleEvents(void)
 {
   Event event;
@@ -190,6 +196,8 @@ static void HandleEvents(void)
 
   ResetDelayCounter(&event_frame_delay);
 
+  stop_processing_events = FALSE;
+
   while (NextValidEvent(&event))
   {
     switch (event.type)
@@ -245,6 +253,10 @@ static void HandleEvents(void)
     // do not handle events for longer than standard frame delay period
     if (DelayReached(&event_frame_delay, event_frame_delay_value))
       break;
+
+    // do not handle any further events if triggered by a special flag
+    if (stop_processing_events)
+      break;
   }
 }
 
index 3467e76799e88077e4f872d83cd1530c651bc91e..c061b5d2de4b30372bb24ccd4121b73a67338ca2 100644 (file)
@@ -22,6 +22,7 @@
 
 int FilterMouseMotionEvents(void *, Event *);
 boolean NextValidEvent(Event *);
+void StopProcessingEvents(void);
 
 void EventLoop(void);
 void HandleOtherEvents(Event *);