fixed creating additional click events from global animation events
authorHolger Schemel <info@artsoft.org>
Sat, 9 Dec 2023 16:26:19 +0000 (17:26 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 9 Dec 2023 16:33:55 +0000 (17:33 +0100)
When handling global animation events that trigger user events handled
as either key, gadget or screen events, prevent creating additional
key or button events to be handled by global animations again, as this
can confuse further button event processing, which may cause buttons
or menu items to be selected by accident.

src/events.c

index 87eaa2b9be911593392a6107d15413ee3ec6fab3..2e3c7ca9bbd232639c4d62e34153f2cd1ed2b0ea 100644 (file)
@@ -40,6 +40,7 @@ static DelayCounter special_cursor_delay = { 1000 };
 static boolean special_cursor_enabled = FALSE;
 
 static boolean stop_processing_events = FALSE;
+static boolean is_global_anim_event = FALSE;
 
 
 // forward declarations for internal use
@@ -2214,7 +2215,8 @@ void HandleKey(Key key, int key_status)
     ignore_repeated_key = FALSE;
 
     // send key release event to global animation event handling
-    HandleGlobalAnimClicks(-1, -1, KEY_RELEASED, FALSE);
+    if (!is_global_anim_event)
+      HandleGlobalAnimClicks(-1, -1, KEY_RELEASED, FALSE);
 
     return;
   }
@@ -2271,9 +2273,9 @@ void HandleKey(Key key, int key_status)
   }
 
   // some key events are handled like clicks for global animations
-  boolean click = (key == KSYM_space ||
-                  key == KSYM_Return ||
-                  key == KSYM_Escape);
+  boolean click = (!is_global_anim_event && (key == KSYM_space ||
+                                            key == KSYM_Return ||
+                                            key == KSYM_Escape));
 
   if (click && HandleGlobalAnimClicks(-1, -1, MB_LEFTBUTTON, TRUE))
   {
@@ -2833,9 +2835,13 @@ boolean DoKeysymAction(int keysym)
   {
     Key key = (Key)(-keysym);
 
+    is_global_anim_event = TRUE;
+
     HandleKey(key, KEY_PRESSED);
     HandleKey(key, KEY_RELEASED);
 
+    is_global_anim_event = FALSE;
+
     return TRUE;
   }