rnd-20051123-1-src
[rocksndiamonds.git] / src / events.c
index b123c86d7f6667632eda8bfe7385da81ddbe2825..8c3be2c47229f15f6338e421383e754dc529f72b 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,19 @@ static boolean NextValidEvent(Event *event)
 {
   while (PendingEvent())
   {
+    boolean handle_this_event = FALSE;
+
     NextEvent(event);
 
     if (FilterMouseMotionEvents(event))
+      handle_this_event = TRUE;
+
+#if 1
+    if (SkipPressedMouseMotionEvent(event))
+      handle_this_event = FALSE;
+#endif
+
+    if (handle_this_event)
       return TRUE;
   }
 
@@ -112,7 +151,7 @@ void EventLoop(void)
     else
     {
       /* when playing, display a special mouse pointer inside the playfield */
-      if (game_status == GAME_MODE_PLAYING)
+      if (game_status == GAME_MODE_PLAYING && !tape.pausing)
       {
        if (!playfield_cursor_set && cursor_inside_playfield &&
            DelayReached(&playfield_cursor_delay, 1000))
@@ -283,6 +322,11 @@ void HandleButtonEvent(ButtonEvent *event)
   else
     button_status = MB_RELEASED;
 
+#if 0
+  printf("::: button %s\n", event->type == EVENT_BUTTONPRESS ?
+       "pressed" : "released");
+#endif
+
   HandleButton(event->x, event->y, button_status);
 }
 
@@ -298,6 +342,10 @@ void HandleMotionEvent(MotionEvent *event)
 
   motion_status = TRUE;
 
+#if 0
+  printf("::: %d, %d\n", event->x, event->y);
+#endif
+
   HandleButton(event->x, event->y, button_status);
 }
 
@@ -347,6 +395,7 @@ void HandleFocusEvent(FocusChangeEvent *event)
       Delay(100);
       KeyboardAutoRepeatOffUnlessAutoplay();
     }
+
     if (old_joystick_status != -1)
       joystick.status = old_joystick_status;
   }
@@ -520,6 +569,10 @@ static void HandleKeysSpecial(Key key)
     {
       DumpBrush();
     }
+    else if (is_string_suffix(cheat_input, ":DDB"))
+    {
+      DumpBrush_Small();
+    }
   }
 }
 
@@ -643,10 +696,13 @@ void HandleKey(Key key, int key_status)
 
   if (game_status == GAME_MODE_MAIN && key == setup.shortcut.toggle_pause)
   {
+#if 1
+    StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
+#else
     if (setup.autorecord)
       TapeStartRecording();
 
-#if defined(PLATFORM_UNIX)
+#if defined(NETWORK_AVALIABLE)
     if (options.network)
       SendToServer_StartPlaying();
     else
@@ -656,6 +712,7 @@ void HandleKey(Key key, int key_status)
       StopAnimation();
       InitGame();
     }
+#endif
 
     return;
   }
@@ -690,6 +747,7 @@ void HandleKey(Key key, int key_status)
     case GAME_MODE_INFO:
       switch(key)
       {
+       case KSYM_space:
        case KSYM_Return:
          if (game_status == GAME_MODE_MAIN)
            HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE);
@@ -736,6 +794,7 @@ void HandleKey(Key key, int key_status)
     case GAME_MODE_SCORES:
       switch(key)
       {
+       case KSYM_space:
        case KSYM_Return:
        case KSYM_Escape:
          game_status = GAME_MODE_MAIN;
@@ -871,6 +930,11 @@ void HandleKey(Key key, int key_status)
          printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize);
          break;
 
+       case KSYM_v:
+         printf("::: currently using game engine version %d\n",
+                game.engine_version);
+         break;
+
 #if 0
 
        case KSYM_z:
@@ -917,7 +981,7 @@ void HandleNoEvent()
     return;
   }
 
-#if defined(PLATFORM_UNIX)
+#if defined(NETWORK_AVALIABLE)
   if (options.network)
     HandleNetworking();
 #endif