X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=6b5ec687d3aa6ae1000a8e9da1130bedade0d244;hb=3fb9d9cf97f3d4da6066f3c6b2ce84c81b768982;hp=0852cd5529a5bd474a99cbf353adc39bd7d4449b;hpb=29520c5a6cda28d8d58609ff6af657de12424d55;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 0852cd55..6b5ec687 100644 --- a/src/events.c +++ b/src/events.c @@ -53,13 +53,42 @@ int FilterMouseMotionEvents(const Event *event) } /* skip mouse motion events without pressed button outside level editor */ - if (button_status == MB_RELEASED && game_status != GAME_MODE_EDITOR && - game_status != GAME_MODE_PLAYING) + if (button_status == MB_RELEASED && + game_status != GAME_MODE_EDITOR && game_status != GAME_MODE_PLAYING) return 0; else return 1; } +/* to prevent delay problems, skip mouse motion events if the very next + event is also a mouse motion event (and therefore effectively only + handling the last of a row of mouse motion events in the event queue) */ + +boolean SkipPressedMouseMotionEvent(const Event *event) +{ + /* nothing to do if the current event is not a mouse motion event */ + if (event->type != EVENT_MOTIONNOTIFY) + return FALSE; + + /* only skip motion events with pressed button outside level editor */ + if (button_status == MB_RELEASED || + game_status == GAME_MODE_EDITOR || game_status == GAME_MODE_PLAYING) + return FALSE; + + if (PendingEvent()) + { + Event next_event; + + PeekEvent(&next_event); + + /* if next event is also a mouse motion event, skip the current one */ + if (next_event.type == EVENT_MOTIONNOTIFY) + return TRUE; + } + + return FALSE; +} + /* 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 */ @@ -68,9 +97,19 @@ static boolean NextValidEvent(Event *event) { while (PendingEvent()) { + boolean handle_this_event = FALSE; + NextEvent(event); if (FilterMouseMotionEvents(event)) + handle_this_event = TRUE; + +#if 1 + if (SkipPressedMouseMotionEvent(event)) + handle_this_event = FALSE; +#endif + + if (handle_this_event) return TRUE; } @@ -283,6 +322,11 @@ void HandleButtonEvent(ButtonEvent *event) else button_status = MB_RELEASED; +#if 0 + printf("::: button %s\n", event->type == EVENT_BUTTONPRESS ? + "pressed" : "released"); +#endif + HandleButton(event->x, event->y, button_status); } @@ -298,6 +342,10 @@ void HandleMotionEvent(MotionEvent *event) motion_status = TRUE; +#if 0 + printf("::: %d, %d\n", event->x, event->y); +#endif + HandleButton(event->x, event->y, button_status); }