rnd-20050424-1-src
[rocksndiamonds.git] / src / events.c
index 0852cd5529a5bd474a99cbf353adc39bd7d4449b..6b5ec687d3aa6ae1000a8e9da1130bedade0d244 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;
   }
 
@@ -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);
 }