added support for updating grid buttons after the screen was rotated
[rocksndiamonds.git] / src / events.c
index 4755d51ff57dc975ba1a27f91d45f02f7847fe2f..5a4023ec36b3e621d0d22fa5e8dc1b3765dfc293 100644 (file)
@@ -304,7 +304,8 @@ void HandleMouseCursor()
        cursor_inside_playfield &&
        DelayReached(&special_cursor_delay, special_cursor_delay_value))
     {
-      if (level.game_engine_type != GAME_ENGINE_TYPE_MM)
+      if (level.game_engine_type != GAME_ENGINE_TYPE_MM ||
+         tile_cursor.enabled)
        SetMouseCursor(CURSOR_PLAYFIELD);
     }
   }
@@ -400,6 +401,10 @@ void SetPlayerMouseAction(int mx, int my, int button)
 {
   int lx = getLevelFromScreenX(mx);
   int ly = getLevelFromScreenY(my);
+  int new_button = (!local_player->mouse_action.button && button);
+
+  if (local_player->mouse_action.button_hint)
+    button = local_player->mouse_action.button_hint;
 
   ClearPlayerMouseAction();
 
@@ -412,10 +417,12 @@ void SetPlayerMouseAction(int mx, int my, int 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);
+    /* un-pause a paused game only if mouse button was newly pressed down */
+    if (new_button)
+      TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
   }
+
+  SetTileCursorXY(lx, ly);
 }
 
 void SleepWhileUnmapped()
@@ -629,10 +636,35 @@ void HandleWindowEvent(WindowEvent *event)
       if (new_display_width  != video.display_width ||
          new_display_height != video.display_height)
       {
+       int nr = GRID_ACTIVE_NR();      // previous screen orientation
+
        video.display_width  = new_display_width;
        video.display_height = new_display_height;
 
        SDLSetScreenProperties();
+
+       // check if screen orientation has changed (should always be true here)
+       if (nr != GRID_ACTIVE_NR())
+       {
+         int x, y;
+
+         if (game_status == GAME_MODE_SETUP)
+         {
+           // save active virtual buttons (in case of just configuring them)
+           for (x = 0; x < MAX_GRID_XSIZE; x++)
+             for (y = 0; y < MAX_GRID_YSIZE; y++)
+               overlay.grid_button_all[nr][x][y] = overlay.grid_button[x][y];
+         }
+
+         nr = GRID_ACTIVE_NR();
+
+         overlay.grid_xsize = overlay.grid_xsize_all[nr];
+         overlay.grid_ysize = overlay.grid_ysize_all[nr];
+
+         for (x = 0; x < MAX_GRID_XSIZE; x++)
+           for (y = 0; y < MAX_GRID_YSIZE; y++)
+             overlay.grid_button[x][y] = overlay.grid_button_all[nr][x][y];
+       }
       }
     }
 #endif
@@ -956,7 +988,16 @@ void HandleFingerEvent(FingerEvent *event)
     return;
 
   if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+  {
+    if (strEqual(setup.touch.control_type, TOUCH_CONTROL_OFF))
+      local_player->mouse_action.button_hint =
+       (event->type == EVENT_FINGERRELEASE ? MB_NOT_PRESSED :
+        event->x < 0.5                     ? MB_LEFTBUTTON  :
+        event->x > 0.5                     ? MB_RIGHTBUTTON :
+        MB_NOT_PRESSED);
+
     return;
+  }
 
   if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS))
     HandleFingerEvent_VirtualButtons(event);
@@ -2339,7 +2380,12 @@ void HandleJoystick()
        return;
       }
 
-      if (tape.recording && tape.pausing && !tape.use_mouse)
+      if (tape.single_step && tape.recording && tape.pausing && !tape.use_mouse)
+      {
+       if (joystick & JOY_ACTION)
+         TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+      }
+      else if (tape.recording && tape.pausing && !tape.use_mouse)
       {
        if (joystick & JOY_ACTION)
          TapeTogglePause(TAPE_TOGGLE_MANUAL);