From 10cdec98e60d58341356cd14d8b0d360203e827f Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 3 Sep 2023 22:41:12 +0900 Subject: [PATCH] emscripten: Improve gamepads support In the W3C gamepad API, many gamepads are mapped to the "standard layout", where D-pad keys are mapped to buttons 12-15. --- src/sdl_event.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/sdl_event.c b/src/sdl_event.c index 279020e..b8bb8d1 100644 --- a/src/sdl_event.c +++ b/src/sdl_event.c @@ -381,14 +381,26 @@ void sdl_handle_event(SDL_Event *e) { case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: - if (e->jbutton.button < 4) { - int i = 1 << (e->jbutton.button+4); - if (e->jbutton.state == SDL_PRESSED) - joyinfo |= i; - else - joyinfo &= ~i; - } else { - if (e->jbutton.state == SDL_RELEASED) { + { + int mask = 0; + switch (e->jbutton.button) { + case 0: case 1: case 2: case 3: + mask = 1 << (e->jbutton.button + 4); + break; +#ifdef __EMSCRIPTEN__ + // Gamepads known to browsers get a "standard" mapping where D-pad + // keys are mapped to buttons 12-15. + case 12: mask = SYS35KEY_UP; break; + case 13: mask = SYS35KEY_DOWN; break; + case 14: mask = SYS35KEY_LEFT; break; + case 15: mask = SYS35KEY_RIGHT; break; +#endif + } + if (mask) { + if (e->jbutton.state == SDL_PRESSED) + joyinfo |= mask; + else + joyinfo &= ~mask; } } break;