rnd-20030411-1-src
[rocksndiamonds.git] / src / events.c
index b5be2a1610394fd4e33fa3078d2e3e5124eeff8c..ffe1d4f0b09b306762c9560bab9a8ccf66a264c7 100644 (file)
 #define KEY_PRESSED            TRUE
 
 
+static boolean cursor_inside_playfield = FALSE;
+static boolean playfield_cursor_set = FALSE;
+static unsigned long playfield_cursor_delay = 0;
+
+
 /* event filter especially needed for SDL event filtering due to
    delay problems with lots of mouse motion events when mouse button
    not pressed (X11 can handle this with 'PointerMotionHintMask') */
 
 int FilterMouseMotionEvents(const Event *event)
 {
+  MotionEvent *motion;
+
   /* non-motion events are directly passed to event handler functions */
   if (event->type != EVENT_MOTIONNOTIFY)
     return 1;
 
-  /* when playing, display a different mouse pointer inside the playfield */
-  if (game_status == PLAYING)
-  {
-    static boolean inside_field = FALSE;
-    MotionEvent *motion = (MotionEvent *)event;
+  motion = (MotionEvent *)event;
+  cursor_inside_playfield = (motion->x >= SX && motion->x < SX + SXSIZE &&
+                            motion->y >= SY && motion->y < SY + SYSIZE);
 
-    if ((motion->x >= SX && motion->x < SX + SXSIZE &&
-        motion->y >= SY && motion->y < SY + SYSIZE) != inside_field)
-    {
-      inside_field = !inside_field;
-
-      SetMouseCursor(inside_field ? CURSOR_PLAYFIELD : CURSOR_DEFAULT);
-    }
+  if (game_status == PLAYING && playfield_cursor_set)
+  {
+    SetMouseCursor(CURSOR_DEFAULT);
+    playfield_cursor_set = FALSE;
+    DelayReached(&playfield_cursor_delay, 0);
   }
 
   /* skip mouse motion events without pressed button outside level editor */
@@ -111,7 +114,25 @@ void EventLoop(void)
       }
     }
     else
+    {
+      /* when playing, display a special mouse pointer inside the playfield */
+      if (game_status == PLAYING)
+      {
+       if (!playfield_cursor_set && cursor_inside_playfield &&
+           DelayReached(&playfield_cursor_delay, 1000))
+       {
+         SetMouseCursor(CURSOR_PLAYFIELD);
+         playfield_cursor_set = TRUE;
+       }
+      }
+      else if (playfield_cursor_set)
+      {
+       SetMouseCursor(CURSOR_DEFAULT);
+       playfield_cursor_set = FALSE;
+      }
+
       HandleNoEvent();
+    }
 
     /* don't use all CPU time when idle; the main loop while playing
        has its own synchronization and is CPU friendly, too */