X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=2b55372054f61a8479e66ccb911cbb7ed77dae75;hb=90cd4dc88df3f891ecaa0ee9b9010fe432154503;hp=eaa87c00989d9ed5379db662e3276071df20998d;hpb=71664f429ff6b802e1826ce51688ce81914ada0d;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index eaa87c00..2b553720 100644 --- a/src/events.c +++ b/src/events.c @@ -94,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; @@ -111,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) @@ -322,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)) @@ -653,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()) @@ -1274,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; @@ -1347,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; @@ -1363,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 (level.has_mouse_events && valid_mouse_event) + SetPlayerMouseAction(mx, my, button); } } @@ -1448,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 @@ -1680,6 +1697,14 @@ void HandleButton(int mx, int my, int button, int button_nr) strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER) || (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS) && !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))