added unpausing tape by key or mouse button for appropriate tape mode
[rocksndiamonds.git] / src / events.c
index f769714ea10da1c7a6017d653d48cbbcdba1a0f5..18898fb2c8e1401c1a97d76580b6ddfc1a849914 100644 (file)
@@ -370,6 +370,13 @@ void ClearEventQueue()
   }
 }
 
+void ClearPlayerMouseAction()
+{
+  local_player->mouse_action.lx = 0;
+  local_player->mouse_action.ly = 0;
+  local_player->mouse_action.button = 0;
+}
+
 void ClearPlayerAction()
 {
   int i;
@@ -380,6 +387,29 @@ void ClearPlayerAction()
     stored_player[i].action = 0;
 
   ClearJoystickState();
+  ClearPlayerMouseAction();
+}
+
+void SetPlayerMouseAction(int mx, int my, int button)
+{
+  int lx = getLevelFromScreenX(mx);
+  int ly = getLevelFromScreenY(my);
+
+  ClearPlayerMouseAction();
+
+  if (!IN_GFX_FIELD_PLAY(mx, my) || !IN_LEV_FIELD(lx, ly))
+    return;
+
+  local_player->mouse_action.lx = lx;
+  local_player->mouse_action.ly = ly;
+  local_player->mouse_action.button = button;
+
+  if (tape.recording && tape.pausing && tape.use_mouse)
+  {
+    /* prevent button release or motion events from un-pausing a paused game */
+    if (button && !motion_status)
+      TapeTogglePause(TAPE_TOGGLE_MANUAL);
+  }
 }
 
 void SleepWhileUnmapped()
@@ -1325,16 +1355,15 @@ void HandleButton(int mx, int my, int button, int button_nr)
       break;
 
     case GAME_MODE_PLAYING:
-      if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
-       ClickElement(mx, my, button);
+      SetPlayerMouseAction(mx, my, button);
+
 #if defined(TARGET_SDL2)
-      else
-       HandleFollowFinger(mx, my, button);
+      HandleFollowFinger(mx, my, button);
 #endif
 
 #ifdef DEBUG
-      if (button == MB_PRESSED && !motion_status && IN_GFX_FIELD_PLAY(mx, my) &&
-         GetKeyModState() & KMOD_Control)
+      if (button == MB_PRESSED && !motion_status && !button_hold &&
+         IN_GFX_FIELD_PLAY(mx, my) && GetKeyModState() & KMOD_Control)
        DumpTileFromScreen(mx, my);
 #endif
 
@@ -1625,7 +1654,7 @@ void HandleKey(Key key, int key_status)
          has_snapped[pnr] = FALSE;
        }
       }
-      else if (tape.recording && tape.pausing)
+      else if (tape.recording && tape.pausing && !tape.use_mouse)
       {
        /* prevent key release events from un-pausing a paused game */
        if (key_status == KEY_PRESSED && key_action & KEY_ACTION)