fixed check for virtual buttons when handling gadgets
authorHolger Schemel <info@artsoft.org>
Wed, 18 Sep 2019 21:14:31 +0000 (23:14 +0200)
committerHolger Schemel <info@artsoft.org>
Wed, 18 Sep 2019 21:14:31 +0000 (23:14 +0200)
Before, when handling finger events, a flag was set to indicate if
any virtual button was pressed to prevent handling gadgets at the
same screen position. This check was broken, because button events
(including gadget checks) may be processed before the corresponding
finger events are handled, in which case this flag will be set too
late.

Now, checking if virtual buttons are pressed is done directly before
attempting to handle gadgets at the same screen position, so it does
not make a difference if button events or finger events are handled
first.

src/events.c

index 073e0db8c220116aa33eb1c88f880f4c0d20b980..eaa87c00989d9ed5379db662e3276071df20998d 100644 (file)
@@ -39,7 +39,6 @@ static int cursor_mode_last = CURSOR_DEFAULT;
 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;
 
 
@@ -477,6 +476,21 @@ static Key GetKeyFromGridButton(int grid_button)
          KSYM_UNDEFINED);
 }
 
+#if defined(PLATFORM_ANDROID)
+static boolean CheckVirtualButtonPressed(int mx, int my, int button)
+{
+  float touch_x = (float)(mx + video.screen_xoffset) / video.screen_width;
+  float touch_y = (float)(my + video.screen_yoffset) / video.screen_height;
+  int x = touch_x * overlay.grid_xsize;
+  int y = touch_y * overlay.grid_ysize;
+  int grid_button = overlay.grid_button[x][y];
+  Key key = GetKeyFromGridButton(grid_button);
+  int key_status = (button == MB_RELEASED ? KEY_RELEASED : KEY_PRESSED);
+
+  return (key_status == KEY_PRESSED && key != KSYM_UNDEFINED);
+}
+#endif
+
 void HandleButtonEvent(ButtonEvent *event)
 {
 #if DEBUG_EVENTS_BUTTON
@@ -687,8 +701,6 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event)
                           "KEY_PRESSED");
   int i;
 
-  virtual_button_pressed = (key_status == KEY_PRESSED && key != KSYM_UNDEFINED);
-
   // for any touch input event, enable overlay buttons (if activated)
   SetOverlayEnabled(TRUE);
 
@@ -1667,7 +1679,7 @@ void HandleButton(int mx, int my, int button, int button_nr)
      level.game_engine_type == GAME_ENGINE_TYPE_MM ||
      strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER) ||
      (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS) &&
-      !virtual_button_pressed));
+      !CheckVirtualButtonPressed(mx, my, button)));
 #endif
 
   if (HandleGlobalAnimClicks(mx, my, button, FALSE))