rnd-20030404-4-src
[rocksndiamonds.git] / src / events.c
index 468da146ad5f9e4bcba47106b2cbc24b6765c4c5..b5be2a1610394fd4e33fa3078d2e3e5124eeff8c 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-* (c) 1995-2001 Artsoft Entertainment                      *
+* (c) 1995-2002 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
 
 
 /* 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:
@@ -444,7 +464,7 @@ void HandleKey(Key key, int key_status)
 
       if (tape.single_step && clear_button_2[pnr])
       {
-       stored_player[pnr].action &= ~MV_BUTTON_2;
+       stored_player[pnr].action &= ~KEY_BUTTON_2;
        clear_button_2[pnr] = FALSE;
       }
 
@@ -456,31 +476,31 @@ void HandleKey(Key key, int key_status)
       if (tape.single_step && tape.recording && tape.pausing)
       {
        if (key_status == KEY_PRESSED &&
-           (key_action & (MV_MOTION | MV_BUTTON_1)))
+           (key_action & (KEY_MOTION | KEY_BUTTON_1)))
        {
          TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
 
-         if (key_action & MV_MOTION)
+         if (key_action & KEY_MOTION)
          {
-           if (stored_player[pnr].action & MV_BUTTON_2)
+           if (stored_player[pnr].action & KEY_BUTTON_2)
              bomb_placed[pnr] = TRUE;
          }
        }
        else if (key_status == KEY_RELEASED &&
-                (key_action & MV_BUTTON_2))
+                (key_action & KEY_BUTTON_2))
        {
          if (!bomb_placed[pnr])
          {
            TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
 
-           stored_player[pnr].action |= MV_BUTTON_2;
+           stored_player[pnr].action |= KEY_BUTTON_2;
            clear_button_2[pnr] = TRUE;
          }
 
          bomb_placed[pnr] = FALSE;
        }
       }
-      else if (tape.recording && tape.pausing)
+      else if (tape.recording && tape.pausing && (key_action & KEY_ACTION))
        TapeTogglePause(TAPE_TOGGLE_MANUAL);
     }
   }
@@ -509,7 +529,7 @@ void HandleKey(Key key, int key_status)
   if (key_status == KEY_RELEASED)
     return;
 
-  if ((key == KSYM_Return || key == KSYM_space) &&
+  if ((key == KSYM_Return || key == setup.shortcut.toggle_pause) &&
       game_status == PLAYING && AllPlayersGone)
   {
     CloseDoor(DOOR_CLOSE_1);
@@ -531,23 +551,25 @@ void HandleKey(Key key, int key_status)
     return;
   }
 
-  /* special shortcuts for quick game tape saving and loading */
+  /* special key shortcuts */
   if (game_status == MAINMENU || game_status == PLAYING)
   {
     if (key == setup.shortcut.save_game)
       TapeQuickSave();
     else if (key == setup.shortcut.load_game)
       TapeQuickLoad();
+    else if (key == setup.shortcut.toggle_pause)
+      TapeTogglePause(TAPE_TOGGLE_MANUAL);
   }
 
-
+#if 0
 #ifndef DEBUG
 
   if (game_status == PLAYING && (tape.playing || tape.pausing))
     return;
 
 #endif
-
+#endif
 
 
   HandleGadgetsKeyInput(key);
@@ -564,7 +586,6 @@ void HandleKey(Key key, int key_status)
       switch(key)
       {
        case KSYM_Return:
-       case KSYM_space:
          if (game_status == MAINMENU)
            HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE);
           else if (game_status == CHOOSELEVEL)
@@ -583,11 +604,15 @@ void HandleKey(Key key, int key_status)
         case KSYM_Page_Up:
           if (game_status == CHOOSELEVEL)
             HandleChooseLevel(0,0, 0,-SCR_FIELDY, MB_MENU_MARK);
+         else if (game_status == SETUP)
+           HandleSetupScreen(0,0, 0,-SCR_FIELDY, MB_MENU_MARK);
          break;
 
         case KSYM_Page_Down:
           if (game_status == CHOOSELEVEL)
             HandleChooseLevel(0,0, 0,SCR_FIELDY, MB_MENU_MARK);
+         else if (game_status == SETUP)
+           HandleSetupScreen(0,0, 0,SCR_FIELDY, MB_MENU_MARK);
          break;
 
 #ifdef DEBUG
@@ -609,7 +634,6 @@ void HandleKey(Key key, int key_status)
       switch(key)
       {
        case KSYM_Return:
-       case KSYM_space:
          game_status = MAINMENU;
          DrawMainMenu();
          BackToFront();
@@ -850,11 +874,11 @@ void HandleJoystick()
          !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY))
        newbutton = dx = dy = 0;
 
-      if (game_status==MAINMENU)
+      if (game_status == MAINMENU)
        HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
-      else if (game_status==CHOOSELEVEL)
+      else if (game_status == CHOOSELEVEL)
         HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
-      else if (game_status==SETUP)
+      else if (game_status == SETUP)
        HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
       break;
     }
@@ -867,6 +891,10 @@ void HandleJoystick()
       HandleHelpScreen(!newbutton);
       break;
 
+    case LEVELED:
+      HandleLevelEditorIdle();
+      break;
+
     case PLAYING:
       if (tape.playing || keyboard)
        newbutton = ((joy & JOY_BUTTON) != 0);