rnd-20060111-1-src
[rocksndiamonds.git] / src / events.c
index 0852cd5529a5bd474a99cbf353adc39bd7d4449b..410c34c28864a56a07725b3acf1aef253194899e 100644 (file)
@@ -53,13 +53,42 @@ int FilterMouseMotionEvents(const Event *event)
   }
 
   /* skip mouse motion events without pressed button outside level editor */
-  if (button_status == MB_RELEASED && game_status != GAME_MODE_EDITOR &&
-      game_status != GAME_MODE_PLAYING)
+  if (button_status == MB_RELEASED &&
+      game_status != GAME_MODE_EDITOR && game_status != GAME_MODE_PLAYING)
     return 0;
   else
     return 1;
 }
 
+/* to prevent delay problems, skip mouse motion events if the very next
+   event is also a mouse motion event (and therefore effectively only
+   handling the last of a row of mouse motion events in the event queue) */
+
+boolean SkipPressedMouseMotionEvent(const Event *event)
+{
+  /* nothing to do if the current event is not a mouse motion event */
+  if (event->type != EVENT_MOTIONNOTIFY)
+    return FALSE;
+
+  /* only skip motion events with pressed button outside level editor */
+  if (button_status == MB_RELEASED ||
+      game_status == GAME_MODE_EDITOR || game_status == GAME_MODE_PLAYING)
+    return FALSE;
+
+  if (PendingEvent())
+  {
+    Event next_event;
+
+    PeekEvent(&next_event);
+
+    /* if next event is also a mouse motion event, skip the current one */
+    if (next_event.type == EVENT_MOTIONNOTIFY)
+      return TRUE;
+  }
+
+  return FALSE;
+}
+
 /* this is only really needed for non-SDL targets to filter unwanted events;
    when using SDL with properly installed event filter, this function can be
    replaced with a simple "NextEvent()" call, but it doesn't hurt either */
@@ -68,9 +97,17 @@ static boolean NextValidEvent(Event *event)
 {
   while (PendingEvent())
   {
+    boolean handle_this_event = FALSE;
+
     NextEvent(event);
 
     if (FilterMouseMotionEvents(event))
+      handle_this_event = TRUE;
+
+    if (SkipPressedMouseMotionEvent(event))
+      handle_this_event = FALSE;
+
+    if (handle_this_event)
       return TRUE;
   }
 
@@ -291,10 +328,8 @@ void HandleMotionEvent(MotionEvent *event)
   if (!PointerInWindow(window))
     return;    /* window and pointer are on different screens */
 
-#if 1
   if (button_status == MB_RELEASED && game_status != GAME_MODE_EDITOR)
     return;
-#endif
 
   motion_status = TRUE;
 
@@ -400,6 +435,7 @@ void HandleButton(int mx, int my, int button)
       break;
 
     case GAME_MODE_EDITOR:
+      HandleLevelEditorIdle();
       break;
 
     case GAME_MODE_INFO:
@@ -521,6 +557,10 @@ static void HandleKeysSpecial(Key key)
     {
       DumpBrush();
     }
+    else if (is_string_suffix(cheat_input, ":DDB"))
+    {
+      DumpBrush_Small();
+    }
   }
 }
 
@@ -644,19 +684,7 @@ void HandleKey(Key key, int key_status)
 
   if (game_status == GAME_MODE_MAIN && key == setup.shortcut.toggle_pause)
   {
-    if (setup.autorecord)
-      TapeStartRecording();
-
-#if defined(NETWORK_AVALIABLE)
-    if (options.network)
-      SendToServer_StartPlaying();
-    else
-#endif
-    {
-      game_status = GAME_MODE_PLAYING;
-      StopAnimation();
-      InitGame();
-    }
+    StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
 
     return;
   }
@@ -828,32 +856,6 @@ void HandleKey(Key key, int key_status)
          }
          break;
 
-#if 0
-       case KSYM_a:
-         if (ScrollStepSize == TILEX/8)
-           ScrollStepSize = TILEX/4;
-         else
-           ScrollStepSize = TILEX/8;
-         printf("ScrollStepSize == %d\n", ScrollStepSize);
-         break;
-#endif
-
-#if 0
-       case KSYM_m:
-         if (MoveSpeed == 8)
-         {
-           MoveSpeed = 4;
-           ScrollStepSize = TILEX/4;
-         }
-         else
-         {
-           MoveSpeed = 8;
-           ScrollStepSize = TILEX/8;
-         }
-         printf("MoveSpeed == %d\n", MoveSpeed);
-         break;
-#endif
-
        case KSYM_f:
          ScrollStepSize = TILEX/8;
          printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize);
@@ -878,26 +880,6 @@ void HandleKey(Key key, int key_status)
          printf("::: currently using game engine version %d\n",
                 game.engine_version);
          break;
-
-#if 0
-
-       case KSYM_z:
-         {
-           int i;
-
-           for (i = 0; i < MAX_PLAYERS; i++)
-           {
-             printf("Player %d:\n", i);
-             printf("  jx == %d, jy == %d\n",
-                    stored_player[i].jx, stored_player[i].jy);
-             printf("  last_jx == %d, last_jy == %d\n",
-                    stored_player[i].last_jx, stored_player[i].last_jy);
-           }
-           printf("\n");
-         }
-
-         break;
-#endif
 #endif
 
        default: