X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fevents.c;h=b450c2b0d547a79f587da1a82cd8821ed83bb86f;hp=dccf50030d251c58bf543a94ee820a4dec3372a9;hb=520916c89d7d96944bf3d66e3caa5afd840df74c;hpb=1c772a2dcd5e189fb7d6c20be9540aa37ed9de0b diff --git a/src/events.c b/src/events.c index dccf5003..b450c2b0 100644 --- a/src/events.c +++ b/src/events.c @@ -250,7 +250,11 @@ void HandleOtherEvents(Event *event) #if defined(TARGET_SDL2) case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: + // for any game controller button event, disable overlay buttons + SetOverlayEnabled(FALSE); + HandleSpecialGameControllerButtons(event); + /* FALL THROUGH */ case SDL_CONTROLLERDEVICEADDED: case SDL_CONTROLLERDEVICEREMOVED: @@ -354,6 +358,7 @@ void ClearEventQueue() #if defined(TARGET_SDL2) case SDL_CONTROLLERBUTTONUP: + HandleJoystickEvent(&event); ClearPlayerAction(); break; #endif @@ -373,6 +378,8 @@ void ClearPlayerAction() key_joystick_mapping = 0; for (i = 0; i < MAX_PLAYERS; i++) stored_player[i].action = 0; + + ClearJoystickState(); } void SleepWhileUnmapped() @@ -399,6 +406,7 @@ void SleepWhileUnmapped() #if defined(TARGET_SDL2) case SDL_CONTROLLERBUTTONUP: + HandleJoystickEvent(&event); key_joystick_mapping = 0; break; #endif @@ -666,6 +674,9 @@ void HandleFingerEvent(FingerEvent *event) "KEY_PRESSED"); int i; + // for any touch input event, enable overlay buttons (if activated) + SetOverlayEnabled(TRUE); + Error(ERR_DEBUG, "::: key '%s' was '%s' [fingerId: %lld]", getKeyNameFromKey(key), key_status_name, event->fingerId); @@ -1146,9 +1157,16 @@ void HandleKeyEvent(KeyEvent *event) #endif #if defined(PLATFORM_ANDROID) - // always map the "back" button to the "escape" key on Android devices if (key == KSYM_Back) + { + // always map the "back" button to the "escape" key on Android devices key = KSYM_Escape; + } + else + { + // for any key event other than "back" button, disable overlay buttons + SetOverlayEnabled(FALSE); + } #endif HandleKeyModState(keymod, key_status); @@ -1523,6 +1541,16 @@ void HandleKey(Key key, int key_status) int joy = 0; int i; +#if defined(TARGET_SDL2) + /* map special keys (media keys / remote control buttons) to default keys */ + if (key == KSYM_PlayPause) + key = KSYM_space; + else if (key == KSYM_Select) + key = KSYM_Return; +#endif + + HandleSpecialGameControllerKeys(key, key_status); + if (game_status == GAME_MODE_PLAYING) { /* only needed for single-step tape recording mode */ @@ -1595,7 +1623,6 @@ void HandleKey(Key key, int key_status) if (level.game_engine_type == GAME_ENGINE_TYPE_EM || level.game_engine_type == GAME_ENGINE_TYPE_SP) { - if (level.game_engine_type == GAME_ENGINE_TYPE_SP && getRedDiskReleaseFlag_SP() == 0) stored_player[pnr].action &= ~KEY_BUTTON_DROP; @@ -2097,3 +2124,33 @@ void HandleSpecialGameControllerButtons(Event *event) } #endif } + +void HandleSpecialGameControllerKeys(Key key, int key_status) +{ +#if defined(TARGET_SDL2) +#if defined(KSYM_Rewind) && defined(KSYM_FastForward) + int button = SDL_CONTROLLER_BUTTON_INVALID; + + /* map keys to joystick buttons (special hack for Amazon Fire TV remote) */ + if (key == KSYM_Rewind) + button = SDL_CONTROLLER_BUTTON_A; + else if (key == KSYM_FastForward || key == KSYM_Menu) + button = SDL_CONTROLLER_BUTTON_B; + + if (button != SDL_CONTROLLER_BUTTON_INVALID) + { + Event event; + + event.type = (key_status == KEY_PRESSED ? SDL_CONTROLLERBUTTONDOWN : + SDL_CONTROLLERBUTTONUP); + + event.cbutton.which = 0; /* first joystick (Amazon Fire TV remote) */ + event.cbutton.button = button; + event.cbutton.state = (key_status == KEY_PRESSED ? SDL_PRESSED : + SDL_RELEASED); + + HandleJoystickEvent(&event); + } +#endif +#endif +}