X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=c88a27b8dfb80324151e36d6112e1226cb9e90ef;hb=608be3bcd270eb45628a274eddb6dbcc8940accf;hp=879b5396dd22f13549eb52245e15e97d1fa71db5;hpb=066b410c0573fe64a1783116daf9d64883e9f03e;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 879b5396..c88a27b8 100644 --- a/src/events.c +++ b/src/events.c @@ -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 * @@ -29,16 +29,38 @@ #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) { + /* 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 */ + if (game_status == PLAYING) + { + MotionEvent *motion = (MotionEvent *)event; + + cursor_inside_playfield = + (motion->x >= SX && motion->x < SX + SXSIZE && + motion->y >= SY && motion->y < SY + SYSIZE); + + if (playfield_cursor_set) + { + SetMouseCursor(CURSOR_DEFAULT); + DelayReached(&playfield_cursor_delay, 0); + playfield_cursor_set = FALSE; + } + } + + /* skip mouse motion events without pressed button outside level editor */ if (button_status == MB_RELEASED && game_status != LEVELED) return 0; else @@ -95,7 +117,17 @@ void EventLoop(void) } } else + { + /* when playing, display a special mouse pointer inside the playfield */ + if (game_status == PLAYING && cursor_inside_playfield && + DelayReached(&playfield_cursor_delay, 1000)) + { + SetMouseCursor(CURSOR_PLAYFIELD); + playfield_cursor_set = TRUE; + } + 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 +158,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: @@ -176,6 +212,16 @@ void ClearEventQueue() } } +void ClearPlayerAction() +{ + int i; + + /* simulate key release events for still pressed keys */ + key_joystick_mapping = 0; + for (i=0; itype == EVENT_FOCUSOUT) { - int i; - KeyboardAutoRepeatOn(); old_joystick_status = joystick.status; joystick.status = JOYSTICK_NOT_AVAILABLE; - /* simulate key release events for still pressed keys */ - key_joystick_mapping = 0; - for (i=0; itype == EVENT_FOCUSIN) { @@ -418,6 +459,9 @@ void HandleKey(Key key, int key_status) if (game_status == PLAYING) { + /* only needed for single-step tape recording mode */ + static boolean clear_button_2[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; + static boolean bomb_placed[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; int pnr; for (pnr=0; pnr