X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fevents.c;h=69d7a2120a6fe78f2c7536f16954c2fb4908cc2d;hp=87011a9732167f4aafd2c45b73f4d1e61b6e9a96;hb=b32084272306eebf14d2b63ea4dcd1a07994ed6f;hpb=e913fbf7e7caa3234df0de282363ee4d6bb727e1 diff --git a/src/events.c b/src/events.c index 87011a97..69d7a212 100644 --- a/src/events.c +++ b/src/events.c @@ -248,11 +248,13 @@ void HandleOtherEvents(Event *event) #if defined(TARGET_SDL) #if defined(TARGET_SDL2) + case SDL_CONTROLLERBUTTONDOWN: + case SDL_CONTROLLERBUTTONUP: + HandleSpecialGameControllerButtons(event); + /* FALL THROUGH */ case SDL_CONTROLLERDEVICEADDED: case SDL_CONTROLLERDEVICEREMOVED: case SDL_CONTROLLERAXISMOTION: - case SDL_CONTROLLERBUTTONDOWN: - case SDL_CONTROLLERBUTTONUP: #endif case SDL_JOYAXISMOTION: case SDL_JOYBUTTONDOWN: @@ -350,6 +352,13 @@ void ClearEventQueue() ClearPlayerAction(); break; +#if defined(TARGET_SDL2) + case SDL_CONTROLLERBUTTONUP: + HandleJoystickEvent(&event); + ClearPlayerAction(); + break; +#endif + default: HandleOtherEvents(&event); break; @@ -389,6 +398,13 @@ void SleepWhileUnmapped() key_joystick_mapping = 0; break; +#if defined(TARGET_SDL2) + case SDL_CONTROLLERBUTTONUP: + HandleJoystickEvent(&event); + key_joystick_mapping = 0; + break; +#endif + case EVENT_MAPNOTIFY: window_unmapped = FALSE; break; @@ -1996,10 +2012,23 @@ void HandleJoystick() case GAME_MODE_INFO: { static unsigned int joystickmove_delay = 0; + static unsigned int joystickmove_delay_value = GADGET_FRAME_DELAY; + static int joystick_last = 0; if (joystick && !button && - !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY)) + !DelayReached(&joystickmove_delay, joystickmove_delay_value)) + { + /* delay joystick actions if buttons/axes continually pressed */ newbutton = dx = dy = 0; + } + else + { + /* start with longer delay, then continue with shorter delay */ + if (joystick != joystick_last) + joystickmove_delay_value = GADGET_FRAME_DELAY_FIRST; + else + joystickmove_delay_value = GADGET_FRAME_DELAY; + } if (game_status == GAME_MODE_TITLE) HandleTitleScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); @@ -2013,6 +2042,9 @@ void HandleJoystick() HandleSetupScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_INFO) HandleInfoScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + + joystick_last = joystick; + break; } @@ -2031,9 +2063,39 @@ void HandleJoystick() return; } + if (tape.recording && tape.pausing) + { + if (joystick & JOY_ACTION) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + } + break; default: break; } } + +void HandleSpecialGameControllerButtons(Event *event) +{ +#if defined(TARGET_SDL2) + switch (event->type) + { + case SDL_CONTROLLERBUTTONDOWN: + if (event->cbutton.button == SDL_CONTROLLER_BUTTON_START) + HandleKey(KSYM_space, KEY_PRESSED); + else if (event->cbutton.button == SDL_CONTROLLER_BUTTON_BACK) + HandleKey(KSYM_Escape, KEY_PRESSED); + + break; + + case SDL_CONTROLLERBUTTONUP: + if (event->cbutton.button == SDL_CONTROLLER_BUTTON_START) + HandleKey(KSYM_space, KEY_RELEASED); + else if (event->cbutton.button == SDL_CONTROLLER_BUTTON_BACK) + HandleKey(KSYM_Escape, KEY_RELEASED); + + break; + } +#endif +}