X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=c32f35e91356cf6800d7a9a50a56c5ab028bda74;hb=def7303f9655be9d5fba4c313c61544fa284af2d;hp=073e0db8c220116aa33eb1c88f880f4c0d20b980;hpb=519124736d97d1e9042eb4713dc23e1a543e3dd4;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 073e0db8..c32f35e9 100644 --- a/src/events.c +++ b/src/events.c @@ -39,7 +39,6 @@ static int cursor_mode_last = CURSOR_DEFAULT; static unsigned int special_cursor_delay = 0; static unsigned int special_cursor_delay_value = 1000; -static boolean virtual_button_pressed = FALSE; static boolean stop_processing_events = FALSE; @@ -95,6 +94,25 @@ static int FilterEvents(const Event *event) ((MotionEvent *)event)->y -= video.screen_yoffset; } + if (event->type == EVENT_BUTTONPRESS || + event->type == EVENT_BUTTONRELEASE || + event->type == EVENT_MOTIONNOTIFY) + { + // do not reset mouse cursor before all pending events have been processed + if (gfx.cursor_mode == cursor_mode_last && + ((game_status == GAME_MODE_TITLE && + gfx.cursor_mode == CURSOR_NONE) || + (game_status == GAME_MODE_PLAYING && + gfx.cursor_mode == CURSOR_PLAYFIELD))) + { + SetMouseCursor(CURSOR_DEFAULT); + + DelayReached(&special_cursor_delay, 0); + + cursor_mode_last = CURSOR_DEFAULT; + } + } + // non-motion events are directly passed to event handler functions if (event->type != EVENT_MOTIONNOTIFY) return 1; @@ -112,20 +130,6 @@ static int FilterEvents(const Event *event) gfx.mouse_x = motion->x; gfx.mouse_y = motion->y; - // do no reset mouse cursor before all pending events have been processed - if (gfx.cursor_mode == cursor_mode_last && - ((game_status == GAME_MODE_TITLE && - gfx.cursor_mode == CURSOR_NONE) || - (game_status == GAME_MODE_PLAYING && - gfx.cursor_mode == CURSOR_PLAYFIELD))) - { - SetMouseCursor(CURSOR_DEFAULT); - - DelayReached(&special_cursor_delay, 0); - - cursor_mode_last = CURSOR_DEFAULT; - } - // 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) @@ -323,6 +327,10 @@ static void HandleMouseCursor(void) { // when playing, display a special mouse pointer inside the playfield + // display normal pointer if mouse pressed + if (button_status != MB_RELEASED) + DelayReached(&special_cursor_delay, 0); + if (gfx.cursor_mode != CURSOR_PLAYFIELD && cursor_inside_playfield && DelayReached(&special_cursor_delay, special_cursor_delay_value)) @@ -456,7 +464,7 @@ static void SetPlayerMouseAction(int mx, int my, int button) local_player->mouse_action.ly = ly; local_player->mouse_action.button = button; - if (tape.recording && tape.pausing && tape.use_mouse) + if (tape.recording && tape.pausing && tape.use_mouse_actions) { // un-pause a paused game only if mouse button was newly pressed down if (new_button) @@ -477,6 +485,21 @@ static Key GetKeyFromGridButton(int grid_button) KSYM_UNDEFINED); } +#if defined(PLATFORM_ANDROID) +static boolean CheckVirtualButtonPressed(int mx, int my, int button) +{ + float touch_x = (float)(mx + video.screen_xoffset) / video.screen_width; + float touch_y = (float)(my + video.screen_yoffset) / video.screen_height; + int x = touch_x * overlay.grid_xsize; + int y = touch_y * overlay.grid_ysize; + int grid_button = overlay.grid_button[x][y]; + Key key = GetKeyFromGridButton(grid_button); + int key_status = (button == MB_RELEASED ? KEY_RELEASED : KEY_PRESSED); + + return (key_status == KEY_PRESSED && key != KSYM_UNDEFINED); +} +#endif + void HandleButtonEvent(ButtonEvent *event) { #if DEBUG_EVENTS_BUTTON @@ -639,6 +662,7 @@ void HandleWindowEvent(WindowEvent *event) video.display_height = new_display_height; SDLSetScreenProperties(); + SetGadgetsPosition_OverlayTouchButtons(); // check if screen orientation has changed (should always be true here) if (nr != GRID_ACTIVE_NR()) @@ -687,8 +711,6 @@ static void HandleFingerEvent_VirtualButtons(FingerEvent *event) "KEY_PRESSED"); int i; - virtual_button_pressed = (key_status == KEY_PRESSED && key != KSYM_UNDEFINED); - // for any touch input event, enable overlay buttons (if activated) SetOverlayEnabled(TRUE); @@ -1262,7 +1284,7 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) int last_move_dir = (ABS(dx) > ABS(dy) ? MV_VERTICAL : MV_HORIZONTAL); if (level.game_engine_type == GAME_ENGINE_TYPE_EM) - level.native_em_level->ply[0]->last_move_dir = last_move_dir; + game_em.ply[0]->last_move_dir = last_move_dir; else local_player->last_move_dir = last_move_dir; @@ -1335,6 +1357,8 @@ static void HandleButtonOrFinger_FollowFinger(int mx, int my, int button) static void HandleButtonOrFinger(int mx, int my, int button) { + boolean valid_mouse_event = (mx != -1 && my != -1 && button != -1); + if (game_status != GAME_MODE_PLAYING) return; @@ -1351,6 +1375,8 @@ static void HandleButtonOrFinger(int mx, int my, int button) { if (strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER)) HandleButtonOrFinger_FollowFinger(mx, my, button); + else if (game.use_mouse_actions && valid_mouse_event) + SetPlayerMouseAction(mx, my, button); } } @@ -1436,6 +1462,9 @@ void HandleKeyEvent(KeyEvent *event) { // for any other "real" key event, disable virtual buttons SetOverlayEnabled(FALSE); + + // for any other "real" key event, disable overlay touch buttons + runtime.uses_touch_device = FALSE; } #endif @@ -1667,7 +1696,15 @@ void HandleButton(int mx, int my, int button, int button_nr) level.game_engine_type == GAME_ENGINE_TYPE_MM || strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER) || (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS) && - !virtual_button_pressed)); + !CheckVirtualButtonPressed(mx, my, button))); + + // always recognize potentially releasing already pressed gadgets + if (button == MB_RELEASED) + handle_gadgets = TRUE; + + // always recognize pressing or releasing overlay touch buttons + if (CheckPosition_OverlayTouchButtons(mx, my, button) && !motion_status) + handle_gadgets = TRUE; #endif if (HandleGlobalAnimClicks(mx, my, button, FALSE)) @@ -2061,43 +2098,46 @@ void HandleKey(Key key, int key_status) if (stored_player[pnr].snap_action) stored_player[pnr].action |= JOY_BUTTON_SNAP; - if (tape.single_step && tape.recording && tape.pausing && !tape.use_mouse) + if (tape.recording && tape.pausing && tape.use_key_actions) { - if (key_status == KEY_PRESSED && key_action & KEY_MOTION) + if (tape.single_step) { - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + if (key_status == KEY_PRESSED && key_action & KEY_MOTION) + { + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - // if snap key already pressed, keep pause mode when releasing - if (stored_player[pnr].action & KEY_BUTTON_SNAP) - has_snapped[pnr] = TRUE; - } - else if (key_status == KEY_PRESSED && key_action & KEY_BUTTON_DROP) - { - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + // if snap key already pressed, keep pause mode when releasing + if (stored_player[pnr].action & KEY_BUTTON_SNAP) + has_snapped[pnr] = TRUE; + } + else if (key_status == KEY_PRESSED && key_action & KEY_BUTTON_DROP) + { + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - if (level.game_engine_type == GAME_ENGINE_TYPE_SP && - getRedDiskReleaseFlag_SP() == 0) + if (level.game_engine_type == GAME_ENGINE_TYPE_SP && + getRedDiskReleaseFlag_SP() == 0) + { + // add a single inactive frame before dropping starts + stored_player[pnr].action &= ~KEY_BUTTON_DROP; + stored_player[pnr].force_dropping = TRUE; + } + } + else if (key_status == KEY_RELEASED && key_action & KEY_BUTTON_SNAP) { - // add a single inactive frame before dropping starts - stored_player[pnr].action &= ~KEY_BUTTON_DROP; - stored_player[pnr].force_dropping = TRUE; + // if snap key was pressed without direction, leave pause mode + if (!has_snapped[pnr]) + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + + has_snapped[pnr] = FALSE; } } - else if (key_status == KEY_RELEASED && key_action & KEY_BUTTON_SNAP) + else { - // if snap key was pressed without direction, leave pause mode - if (!has_snapped[pnr]) - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - - has_snapped[pnr] = FALSE; + // prevent key release events from un-pausing a paused game + if (key_status == KEY_PRESSED && key_action & KEY_ACTION) + TapeTogglePause(TAPE_TOGGLE_MANUAL); } } - 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) - TapeTogglePause(TAPE_TOGGLE_MANUAL); - } // for MM style levels, handle in-game keyboard input in HandleJoystick() if (level.game_engine_type == GAME_ENGINE_TYPE_MM) @@ -2593,15 +2633,18 @@ void HandleJoystick(void) return; } - if (tape.single_step && tape.recording && tape.pausing && !tape.use_mouse) - { - if (joystick & JOY_ACTION) - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - } - else if (tape.recording && tape.pausing && !tape.use_mouse) + if (tape.recording && tape.pausing && tape.use_key_actions) { - if (joystick & JOY_ACTION) - TapeTogglePause(TAPE_TOGGLE_MANUAL); + if (tape.single_step) + { + if (joystick & JOY_ACTION) + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + } + else + { + if (joystick & JOY_ACTION) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + } } if (level.game_engine_type == GAME_ENGINE_TYPE_MM)