added support for undo/redo using Ctrl-z/Ctrl-Shift-z in level editor
[rocksndiamonds.git] / src / events.c
index f6442956645825d6ac8e1e1cdcd970e01fe64397..9526f198b7c3e228b4f13e1834eab148d07c4fd9 100644 (file)
@@ -40,6 +40,7 @@ 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;
 
 
 // forward declarations for internal use
@@ -102,6 +103,15 @@ static int FilterEvents(const Event *event)
   cursor_inside_playfield = (motion->x >= SX && motion->x < SX + SXSIZE &&
                             motion->y >= SY && motion->y < SY + SYSIZE);
 
+  // set correct mouse x/y position (for pointer class global animations)
+  // (this is required in rare cases where the mouse x/y position calculated
+  // from raw values (to apply logical screen size scaling corrections) does
+  // not match the final mouse event x/y position -- this may happen because
+  // the SDL renderer's viewport position is internally represented as float,
+  // but only accessible as integer, which may lead to rounding errors)
+  gfx.mouse_x = motion->x;
+  gfx.mouse_y = motion->y;
+
   // do no reset mouse cursor before all pending events have been processed
   if (gfx.cursor_mode == cursor_mode_last &&
       ((game_status == GAME_MODE_TITLE &&
@@ -182,6 +192,11 @@ boolean NextValidEvent(Event *event)
   return FALSE;
 }
 
+void StopProcessingEvents(void)
+{
+  stop_processing_events = TRUE;
+}
+
 static void HandleEvents(void)
 {
   Event event;
@@ -190,6 +205,8 @@ static void HandleEvents(void)
 
   ResetDelayCounter(&event_frame_delay);
 
+  stop_processing_events = FALSE;
+
   while (NextValidEvent(&event))
   {
     switch (event.type)
@@ -245,6 +262,10 @@ static void HandleEvents(void)
     // do not handle events for longer than standard frame delay period
     if (DelayReached(&event_frame_delay, event_frame_delay_value))
       break;
+
+    // do not handle any further events if triggered by a special flag
+    if (stop_processing_events)
+      break;
   }
 }
 
@@ -1889,6 +1910,13 @@ static void HandleKeysSpecial(Key key)
       {
        CopyClipboardToBrush();
       }
+      else if (letter == 'z')  // undo or redo last operation
+      {
+       if (GetKeyModState() & KMOD_Shift)
+         RedoLevelEditorOperation();
+       else
+         UndoLevelEditorOperation();
+      }
     }
   }