rnd-20030404-4-src
[rocksndiamonds.git] / src / events.c
index fc6140fc84a0c959d5eaaeb5966acdd1c3fa2d95..b5be2a1610394fd4e33fa3078d2e3e5124eeff8c 100644 (file)
 
 
 /* event filter especially needed for SDL event filtering due to
-   delay problems with lots of mouse motion events when mouse
-   button not pressed */
+   delay problems with lots of mouse motion events when mouse button
+   not pressed (X11 can handle this with 'PointerMotionHintMask') */
 
 int FilterMouseMotionEvents(const Event *event)
 {
+  /* non-motion events are directly passed to event handler functions */
   if (event->type != EVENT_MOTIONNOTIFY)
     return 1;
 
-  /* get mouse motion events without pressed button only in level editor */
+  /* when playing, display a different mouse pointer inside the playfield */
+  if (game_status == PLAYING)
+  {
+    static boolean inside_field = FALSE;
+    MotionEvent *motion = (MotionEvent *)event;
+
+    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);
+    }
+  }
+
+  /* skip mouse motion events without pressed button outside level editor */
   if (button_status == MB_RELEASED && game_status != LEVELED)
     return 0;
   else
@@ -126,7 +142,11 @@ void HandleOtherEvents(Event *event)
       break;
 
     case EVENT_UNMAPNOTIFY:
+#if 0
+      /* This causes the game to stop not only when iconified, but also
+        when on another virtual desktop, which might be not desired. */
       SleepWhileUnmapped();
+#endif
       break;
 
     case EVENT_FOCUSIN:
@@ -542,14 +562,14 @@ void HandleKey(Key key, int key_status)
       TapeTogglePause(TAPE_TOGGLE_MANUAL);
   }
 
-
+#if 0
 #ifndef DEBUG
 
   if (game_status == PLAYING && (tape.playing || tape.pausing))
     return;
 
 #endif
-
+#endif
 
 
   HandleGadgetsKeyInput(key);
@@ -871,6 +891,10 @@ void HandleJoystick()
       HandleHelpScreen(!newbutton);
       break;
 
+    case LEVELED:
+      HandleLevelEditorIdle();
+      break;
+
     case PLAYING:
       if (tape.playing || keyboard)
        newbutton = ((joy & JOY_BUTTON) != 0);