#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 */
+ 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;
- /* get mouse motion events without pressed button only in level editor */
+ motion = (MotionEvent *)event;
+ cursor_inside_playfield = (motion->x >= SX && motion->x < SX + SXSIZE &&
+ motion->y >= SY && motion->y < SY + SYSIZE);
+
+ 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 */
if (button_status == MB_RELEASED && game_status != LEVELED)
return 0;
else
}
}
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 */
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;
printf(" MovPos[%d][%d] == %d\n", x,y, MovPos[x][y]);
printf(" MovDir[%d][%d] == %d\n", x,y, MovDir[x][y]);
printf(" MovDelay[%d][%d] == %d\n", x,y, MovDelay[x][y]);
+ printf(" GfxElement[%d][%d] == %d\n", x,y, GfxElement[x][y]);
printf("\n");
}
}
TapeTogglePause(TAPE_TOGGLE_MANUAL);
}
-
+#if 0
#ifndef DEBUG
if (game_status == PLAYING && (tape.playing || tape.pausing))
return;
#endif
-
+#endif
HandleGadgetsKeyInput(key);