X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=ffe1d4f0b09b306762c9560bab9a8ccf66a264c7;hb=e57078603232563176d90bb543ce2bc3a15b889e;hp=468da146ad5f9e4bcba47106b2cbc24b6765c4c5;hpb=4e3bc17b6150a17a76cba2da2daa96af65bde5b9;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 468da146..ffe1d4f0 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,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: @@ -444,7 +485,7 @@ void HandleKey(Key key, int key_status) if (tape.single_step && clear_button_2[pnr]) { - stored_player[pnr].action &= ~MV_BUTTON_2; + stored_player[pnr].action &= ~KEY_BUTTON_2; clear_button_2[pnr] = FALSE; } @@ -456,31 +497,31 @@ void HandleKey(Key key, int key_status) if (tape.single_step && tape.recording && tape.pausing) { if (key_status == KEY_PRESSED && - (key_action & (MV_MOTION | MV_BUTTON_1))) + (key_action & (KEY_MOTION | KEY_BUTTON_1))) { TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - if (key_action & MV_MOTION) + if (key_action & KEY_MOTION) { - if (stored_player[pnr].action & MV_BUTTON_2) + if (stored_player[pnr].action & KEY_BUTTON_2) bomb_placed[pnr] = TRUE; } } else if (key_status == KEY_RELEASED && - (key_action & MV_BUTTON_2)) + (key_action & KEY_BUTTON_2)) { if (!bomb_placed[pnr]) { TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - stored_player[pnr].action |= MV_BUTTON_2; + stored_player[pnr].action |= KEY_BUTTON_2; clear_button_2[pnr] = TRUE; } bomb_placed[pnr] = FALSE; } } - else if (tape.recording && tape.pausing) + else if (tape.recording && tape.pausing && (key_action & KEY_ACTION)) TapeTogglePause(TAPE_TOGGLE_MANUAL); } } @@ -509,7 +550,7 @@ void HandleKey(Key key, int key_status) if (key_status == KEY_RELEASED) return; - if ((key == KSYM_Return || key == KSYM_space) && + if ((key == KSYM_Return || key == setup.shortcut.toggle_pause) && game_status == PLAYING && AllPlayersGone) { CloseDoor(DOOR_CLOSE_1); @@ -531,23 +572,25 @@ void HandleKey(Key key, int key_status) return; } - /* special shortcuts for quick game tape saving and loading */ + /* special key shortcuts */ if (game_status == MAINMENU || game_status == PLAYING) { if (key == setup.shortcut.save_game) TapeQuickSave(); else if (key == setup.shortcut.load_game) TapeQuickLoad(); + else if (key == setup.shortcut.toggle_pause) + TapeTogglePause(TAPE_TOGGLE_MANUAL); } - +#if 0 #ifndef DEBUG if (game_status == PLAYING && (tape.playing || tape.pausing)) return; #endif - +#endif HandleGadgetsKeyInput(key); @@ -564,7 +607,6 @@ void HandleKey(Key key, int key_status) switch(key) { case KSYM_Return: - case KSYM_space: if (game_status == MAINMENU) HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE); else if (game_status == CHOOSELEVEL) @@ -583,11 +625,15 @@ void HandleKey(Key key, int key_status) case KSYM_Page_Up: if (game_status == CHOOSELEVEL) HandleChooseLevel(0,0, 0,-SCR_FIELDY, MB_MENU_MARK); + else if (game_status == SETUP) + HandleSetupScreen(0,0, 0,-SCR_FIELDY, MB_MENU_MARK); break; case KSYM_Page_Down: if (game_status == CHOOSELEVEL) HandleChooseLevel(0,0, 0,SCR_FIELDY, MB_MENU_MARK); + else if (game_status == SETUP) + HandleSetupScreen(0,0, 0,SCR_FIELDY, MB_MENU_MARK); break; #ifdef DEBUG @@ -609,7 +655,6 @@ void HandleKey(Key key, int key_status) switch(key) { case KSYM_Return: - case KSYM_space: game_status = MAINMENU; DrawMainMenu(); BackToFront(); @@ -850,11 +895,11 @@ void HandleJoystick() !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY)) newbutton = dx = dy = 0; - if (game_status==MAINMENU) + if (game_status == MAINMENU) HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); - else if (game_status==CHOOSELEVEL) + else if (game_status == CHOOSELEVEL) HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); - else if (game_status==SETUP) + else if (game_status == SETUP) HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); break; } @@ -867,6 +912,10 @@ void HandleJoystick() HandleHelpScreen(!newbutton); break; + case LEVELED: + HandleLevelEditorIdle(); + break; + case PLAYING: if (tape.playing || keyboard) newbutton = ((joy & JOY_BUTTON) != 0);