X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=1f78e6b2559b1a814425ef7d2072c9ce420219f8;hb=c956237d7c5507aea649ce7b20c00d7bd9d37a7a;hp=8daab243f879851540e972dd04e79f0255a23b0a;hpb=c6f9fba81fc59eff4b6b454dff92adecd28a7ad5;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 8daab243..1f78e6b2 100644 --- a/src/events.c +++ b/src/events.c @@ -29,16 +29,35 @@ #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 @@ -95,7 +114,25 @@ void EventLoop(void) } } 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 */ @@ -126,7 +163,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: @@ -390,6 +431,7 @@ void HandleButton(int mx, int my, int button) 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"); } } @@ -542,14 +584,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);