From 71664f429ff6b802e1826ce51688ce81914ada0d Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Wed, 18 Sep 2019 23:14:31 +0200 Subject: [PATCH] fixed check for virtual buttons when handling gadgets 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 | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/events.c b/src/events.c index 073e0db8..eaa87c00 100644 --- a/src/events.c +++ b/src/events.c @@ -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)) -- 2.34.1