+/* values for key_status */
+#define KEY_NOT_PRESSED FALSE
+#define KEY_RELEASED FALSE
+#define KEY_PRESSED TRUE
+
+
+/* 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)
+{
+ /* 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;
+
+ 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
+ return 1;
+}
+
+/* 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 */
+
+static boolean NextValidEvent(Event *event)
+{
+ while (PendingEvent())
+ {
+ NextEvent(event);
+
+ if (FilterMouseMotionEvents(event))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+