fixed not closing doors simultaneously after solving a level
[rocksndiamonds.git] / src / events.c
index 7e1f293f9b067cf5792ac4385f1e24a708a3e8b4..3346055722afa7566fa7f249ade02584d18a4f15 100644 (file)
@@ -39,6 +39,8 @@ 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;
+
 
 // forward declarations for internal use
 static void HandleNoEvent(void);
@@ -722,6 +724,8 @@ 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);
 
@@ -1452,9 +1456,15 @@ void HandleKeyEvent(KeyEvent *event)
     // always map the "back" button to the "escape" key on Android devices
     key = KSYM_Escape;
   }
+  else if (key == KSYM_Menu)
+  {
+    // the "menu" button can be used to toggle displaying virtual buttons
+    if (key_status == KEY_PRESSED)
+      SetOverlayEnabled(!GetOverlayEnabled());
+  }
   else
   {
-    // for any key event other than "back" button, disable overlay buttons
+    // for any other "real" key event, disable virtual buttons
     SetOverlayEnabled(FALSE);
   }
 #endif
@@ -1539,10 +1549,13 @@ void HandleButton(int mx, int my, int button, int button_nr)
 #if defined(PLATFORM_ANDROID)
   // when playing, only handle gadgets when using "follow finger" controls
   // or when using touch controls in combination with the MM game engine
+  // or when using gadgets that do not overlap with virtual buttons
   handle_gadgets =
     (game_status != GAME_MODE_PLAYING ||
      level.game_engine_type == GAME_ENGINE_TYPE_MM ||
-     strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER));
+     strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER) ||
+     (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS) &&
+      !virtual_button_pressed));
 #endif
 
   if (HandleGlobalAnimClicks(mx, my, button))
@@ -1778,11 +1791,14 @@ static void HandleKeysSpecial(Key key)
   }
 }
 
-void HandleKeysDebug(Key key)
+boolean HandleKeysDebug(Key key, int key_status)
 {
 #ifdef DEBUG
   int i;
 
+  if (key_status != KEY_PRESSED)
+    return FALSE;
+
   if (game_status == GAME_MODE_PLAYING || !setup.debug.frame_delay_game_only)
   {
     boolean mod_key_pressed = ((GetKeyModState() & KMOD_Valid) != KMOD_None);
@@ -1809,7 +1825,7 @@ void HandleKeysDebug(Key key)
        else
          Error(ERR_DEBUG, "frame delay == 0 ms (maximum speed)");
 
-       break;
+       return TRUE;
       }
     }
   }
@@ -1822,14 +1838,20 @@ void HandleKeysDebug(Key key)
 
       Error(ERR_DEBUG, "debug mode %s",
            (options.debug ? "enabled" : "disabled"));
+
+      return TRUE;
     }
     else if (key == KSYM_v)
     {
       Error(ERR_DEBUG, "currently using game engine version %d",
            game.engine_version);
+
+      return TRUE;
     }
   }
 #endif
+
+  return FALSE;
 }
 
 void HandleKey(Key key, int key_status)
@@ -1856,6 +1878,9 @@ void HandleKey(Key key, int key_status)
   int joy = 0;
   int i;
 
+  if (HandleKeysDebug(key, key_status))
+    return;            // do not handle already processed keys again
+
   // map special keys (media keys / remote control buttons) to default keys
   if (key == KSYM_PlayPause)
     key = KSYM_space;
@@ -2081,10 +2106,7 @@ void HandleKey(Key key, int key_status)
   HandleKeysSpecial(key);
 
   if (HandleGadgetsKeyInput(key))
-  {
-    if (key != KSYM_Escape)    // always allow ESC key to be handled
-      key = KSYM_UNDEFINED;
-  }
+    return;            // do not handle already processed keys again
 
   switch (game_status)
   {
@@ -2201,8 +2223,6 @@ void HandleKey(Key key, int key_status)
        return;
       }
   }
-
-  HandleKeysDebug(key);
 }
 
 void HandleNoEvent(void)