added clearing virtual buttons when clearing player action
[rocksndiamonds.git] / src / events.c
index f4311bfdee435c6701cc11f3feb8d2342d501cd6..69efaf508189e9631cb3b7f3b08f608f364922f5 100644 (file)
@@ -43,6 +43,7 @@ static boolean stop_processing_events = FALSE;
 
 
 // forward declarations for internal use
+static void ClearTouchInfo(void);
 static void HandleNoEvent(void);
 static void HandleEventActions(void);
 
@@ -442,6 +443,10 @@ void ClearPlayerAction(void)
     stored_player[i].snap_action = 0;
   }
 
+  // simulate finger release events for still pressed virtual buttons
+  overlay.grid_button_action = JOY_NO_ACTION;
+
+  ClearTouchInfo();
   ClearJoystickState();
   ClearPlayerMouseAction();
 }
@@ -698,6 +703,24 @@ static struct
   byte action;
 } touch_info[NUM_TOUCH_FINGERS];
 
+static void SetTouchInfo(int pos, SDL_FingerID finger_id, int counter,
+                        Key key, byte action)
+{
+  touch_info[pos].touched = (action != JOY_NO_ACTION);
+  touch_info[pos].finger_id = finger_id;
+  touch_info[pos].counter = counter;
+  touch_info[pos].key = key;
+  touch_info[pos].action = action;
+}
+
+static void ClearTouchInfo(void)
+{
+  int i;
+
+  for (i = 0; i < NUM_TOUCH_FINGERS; i++)
+    SetTouchInfo(i, 0, 0, 0, JOY_NO_ACTION);
+}
+
 static void HandleFingerEvent_VirtualButtons(FingerEvent *event)
 {
   int x = event->x * overlay.grid_xsize;
@@ -807,11 +830,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event)
        }
       }
 
-      touch_info[i].touched = TRUE;
-      touch_info[i].finger_id = event->fingerId;
-      touch_info[i].counter = Counter();
-      touch_info[i].key = key;
-      touch_info[i].action = grid_button_action;
+      SetTouchInfo(i, event->fingerId, Counter(), key, grid_button_action);
     }
     else
     {
@@ -823,11 +842,7 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event)
              getKeyNameFromKey(touch_info[i].key), "KEY_RELEASED", i);
       }
 
-      touch_info[i].touched = FALSE;
-      touch_info[i].finger_id = 0;
-      touch_info[i].counter = 0;
-      touch_info[i].key = 0;
-      touch_info[i].action = JOY_NO_ACTION;
+      SetTouchInfo(i, 0, 0, 0, JOY_NO_ACTION);
     }
   }
 }