X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=c7707c2f6f9fcc7c3904003cac863a518fd66243;hb=0e98fc357c7de32acf995fdcfacb7e1517e8e60c;hp=2998066b98230577aae3198ddbc0b861877646bc;hpb=c7bda2237780e82311e5ede18042f3619b257f8a;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 2998066b..c7707c2f 100644 --- a/src/events.c +++ b/src/events.c @@ -39,6 +39,12 @@ static int cursor_mode_last = CURSOR_DEFAULT; static unsigned int special_cursor_delay = 0; static unsigned int special_cursor_delay_value = 1000; + +/* forward declarations for internal use */ +static void HandleNoEvent(void); +static void HandleEventActions(void); + + /* 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') */ @@ -128,7 +134,7 @@ static boolean SkipPressedMouseMotionEvent(const Event *event) return FALSE; } -static boolean WaitEventFiltered(Event *event) +static boolean WaitValidEvent(Event *event) { WaitEvent(event); @@ -152,7 +158,7 @@ static boolean WaitEventFiltered(Event *event) boolean NextValidEvent(Event *event) { while (PendingEvent()) - if (WaitEventFiltered(event)) + if (WaitValidEvent(event)) return TRUE; return FALSE; @@ -298,7 +304,8 @@ void HandleMouseCursor() cursor_inside_playfield && DelayReached(&special_cursor_delay, special_cursor_delay_value)) { - SetMouseCursor(CURSOR_PLAYFIELD); + if (level.game_engine_type != GAME_ENGINE_TYPE_MM) + SetMouseCursor(CURSOR_PLAYFIELD); } } else if (gfx.cursor_mode != CURSOR_DEFAULT) @@ -317,10 +324,10 @@ void EventLoop(void) if (PendingEvent()) HandleEvents(); else - HandleMouseCursor(); + HandleNoEvent(); - /* also execute after pending events have been processed before */ - HandleNoEvent(); + /* execute event related actions after pending events have been processed */ + HandleEventActions(); /* don't use all CPU time when idle; the main loop while playing has its own synchronization and is CPU friendly, too */ @@ -369,6 +376,13 @@ void ClearEventQueue() } } +void ClearPlayerMouseAction() +{ + local_player->mouse_action.lx = 0; + local_player->mouse_action.ly = 0; + local_player->mouse_action.button = 0; +} + void ClearPlayerAction() { int i; @@ -379,6 +393,29 @@ void ClearPlayerAction() stored_player[i].action = 0; ClearJoystickState(); + ClearPlayerMouseAction(); +} + +void SetPlayerMouseAction(int mx, int my, int button) +{ + int lx = getLevelFromScreenX(mx); + int ly = getLevelFromScreenY(my); + + ClearPlayerMouseAction(); + + if (!IN_GFX_FIELD_PLAY(mx, my) || !IN_LEV_FIELD(lx, ly)) + return; + + local_player->mouse_action.lx = lx; + local_player->mouse_action.ly = ly; + local_player->mouse_action.button = button; + + if (tape.recording && tape.pausing && tape.use_mouse) + { + /* prevent button release or motion events from un-pausing a paused game */ + if (button && !motion_status) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + } } void SleepWhileUnmapped() @@ -391,7 +428,7 @@ void SleepWhileUnmapped() { Event event; - if (!WaitEventFiltered(&event)) + if (!WaitValidEvent(&event)) continue; switch (event.type) @@ -639,7 +676,7 @@ void HandleFingerEvent(FingerEvent *event) if (game_status != GAME_MODE_PLAYING) return; - if (strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER)) + if (strEqual(setup.touch.control_type, TOUCH_CONTROL_OFF)) return; if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS)) @@ -787,6 +824,9 @@ void HandleFingerEvent(FingerEvent *event) return; } + if (!strEqual(setup.touch.control_type, TOUCH_CONTROL_WIPE_GESTURES)) + return; + // use touch direction control if (event->type == EVENT_FINGERPRESS) @@ -1323,14 +1363,16 @@ void HandleButton(int mx, int my, int button, int button_nr) HandleSetupScreen(mx, my, 0, 0, button); break; -#if defined(TARGET_SDL2) case GAME_MODE_PLAYING: + SetPlayerMouseAction(mx, my, button); + +#if defined(TARGET_SDL2) HandleFollowFinger(mx, my, button); #endif #ifdef DEBUG - if (button == MB_PRESSED && !motion_status && IN_GFX_FIELD_PLAY(mx, my) && - GetKeyModState() & KMOD_Control) + if (button == MB_PRESSED && !motion_status && !button_hold && + IN_GFX_FIELD_PLAY(mx, my) && GetKeyModState() & KMOD_Control) DumpTileFromScreen(mx, my); #endif @@ -1621,7 +1663,7 @@ void HandleKey(Key key, int key_status) has_snapped[pnr] = FALSE; } } - else if (tape.recording && tape.pausing) + else if (tape.recording && tape.pausing && !tape.use_mouse) { /* prevent key release events from un-pausing a paused game */ if (key_status == KEY_PRESSED && key_action & KEY_ACTION) @@ -1890,9 +1932,25 @@ void HandleKey(Key key, int key_status) } void HandleNoEvent() +{ + HandleMouseCursor(); + + switch (game_status) + { +#if defined(TARGET_SDL2) + case GAME_MODE_PLAYING: + HandleFollowFinger(-1, -1, -1); + break; +#endif + } +} + +void HandleEventActions() { // if (button_status && game_status != GAME_MODE_PLAYING) - if (button_status && (game_status != GAME_MODE_PLAYING || tape.pausing)) + if (button_status && (game_status != GAME_MODE_PLAYING || + tape.pausing || + level.game_engine_type == GAME_ENGINE_TYPE_MM)) { HandleButton(0, 0, button_status, -button_status); } @@ -1916,12 +1974,6 @@ void HandleNoEvent() HandleLevelEditorIdle(); break; -#if defined(TARGET_SDL2) - case GAME_MODE_PLAYING: - HandleFollowFinger(-1, -1, -1); - break; -#endif - default: break; }