renamed and cleaned up source files for handling global animations
[rocksndiamonds.git] / src / events.c
index d9104aa1be04172a8d64bc8be39b3afd8c57fb46..564f647d396ff52c1f8d230a848fba4b1a2c9ae9 100644 (file)
@@ -19,7 +19,7 @@
 #include "editor.h"
 #include "files.h"
 #include "tape.h"
-#include "cartoons.h"
+#include "anim.h"
 #include "network.h"
 
 
@@ -289,9 +289,6 @@ void HandleMouseCursor()
 
 void EventLoop(void)
 {
-  unsigned int sync_frame_delay = 0;
-  unsigned int sync_frame_delay_value = GAME_FRAME_DELAY;
-
   while (1)
   {
     if (PendingEvent())
@@ -308,11 +305,11 @@ void EventLoop(void)
     if (game_status == GAME_MODE_PLAYING)
       HandleGameActions();
 
-    /* refresh window contents from drawing buffer, if needed */
+    /* always copy backbuffer to visible screen for every video frame */
     BackToFront();
 
-    if (game_status != GAME_MODE_PLAYING)
-      WaitUntilDelayReached(&sync_frame_delay, sync_frame_delay_value);
+    /* reset video frame delay to default (may change again while playing) */
+    SetVideoFrameDelay(GAME_FRAME_DELAY);
 
     if (game_status == GAME_MODE_QUIT)
       return;
@@ -463,10 +460,13 @@ void HandleWindowEvent(WindowEvent *event)
        event_name, event->data1, event->data2);
 #endif
 
+#if 0
+  // (not needed, as the screen gets redrawn every 20 ms anyway)
   if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||
       event->event == SDL_WINDOWEVENT_RESIZED ||
       event->event == SDL_WINDOWEVENT_EXPOSED)
     SDLRedrawWindow();
+#endif
 
   if (event->event == SDL_WINDOWEVENT_RESIZED && !video.fullscreen_enabled)
   {
@@ -480,8 +480,10 @@ void HandleWindowEvent(WindowEvent *event)
       int new_xpercent = (100 * new_window_width  / video.width);
       int new_ypercent = (100 * new_window_height / video.height);
 
-      setup.window_scaling_percent = video.window_scaling_percent =
-       MIN(MAX(MIN_WINDOW_SCALING_PERCENT, MIN(new_xpercent, new_ypercent)),
+      // (extreme window scaling allowed, but cannot be saved permanently)
+      video.window_scaling_percent = MIN(new_xpercent, new_ypercent);
+      setup.window_scaling_percent =
+       MIN(MAX(MIN_WINDOW_SCALING_PERCENT, video.window_scaling_percent),
            MAX_WINDOW_SCALING_PERCENT);
 
       video.window_width  = new_window_width;
@@ -1159,6 +1161,7 @@ static void HandleKeysSpecial(Key key)
 void HandleKey(Key key, int key_status)
 {
   boolean anyTextGadgetActiveOrJustFinished = anyTextGadgetActive();
+  static boolean ignore_repeated_key = FALSE;
   static struct SetupKeyboardInfo ski;
   static struct SetupShortcutInfo ssi;
   static struct
@@ -1326,12 +1329,18 @@ void HandleKey(Key key, int key_status)
     key_joystick_mapping = 0;
 
   if (key_status == KEY_RELEASED)
+  {
+    // reset flag to ignore repeated "key pressed" events after key release
+    ignore_repeated_key = FALSE;
+
     return;
+  }
 
   if ((key == KSYM_F11 ||
        ((key == KSYM_Return ||
         key == KSYM_KP_Enter) && (GetKeyModState() & KMOD_Alt))) &&
-      video.fullscreen_available)
+      video.fullscreen_available &&
+      !ignore_repeated_key)
   {
     setup.fullscreen = !setup.fullscreen;
 
@@ -1340,6 +1349,9 @@ void HandleKey(Key key, int key_status)
     if (game_status == GAME_MODE_SETUP)
       RedrawSetupScreenAfterFullscreenToggle();
 
+    // set flag to ignore repeated "key pressed" events
+    ignore_repeated_key = TRUE;
+
     return;
   }
 
@@ -1611,15 +1623,6 @@ void HandleNoEvent()
   {
     case GAME_MODE_MAIN:
       DrawPreviewLevelAnimation();
-      DoAnimation();
-      break;
-
-    case GAME_MODE_LEVELS:
-    case GAME_MODE_LEVELNR:
-    case GAME_MODE_SETUP:
-    case GAME_MODE_INFO:
-    case GAME_MODE_SCORES:
-      DoAnimation();
       break;
 
     case GAME_MODE_EDITOR: