static bool rwebpad_joypad_init(void *data) { int supported = emscripten_get_num_gamepads(); (void)data; if (supported == EMSCRIPTEN_RESULT_NOT_SUPPORTED) return false; if (!g_rwebpad_initialized) { EMSCRIPTEN_RESULT r; g_rwebpad_initialized = true; /* callbacks needs to be registered for gamepads to connect */ r = emscripten_set_gamepadconnected_callback(NULL, false, rwebpad_gamepad_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { RARCH_ERR( "[EMSCRIPTEN/PAD] failed to create connect callback: %d\n", r); } r = emscripten_set_gamepaddisconnected_callback(NULL, false, rwebpad_gamepad_cb); if (r != EMSCRIPTEN_RESULT_SUCCESS) { RARCH_ERR( "[EMSCRIPTEN/PAD] failed to create disconnect callback: %d\n", r); } } return true; }
/* Function to scan the system for joysticks. * It should return 0, or -1 on an unrecoverable fatal error. */ int SDL_SYS_JoystickInit(void) { int retval, i, numjs; EmscriptenGamepadEvent gamepadState; numjoysticks = 0; numjs = emscripten_get_num_gamepads(); /* Check if gamepad is supported by browser */ if (numjs == EMSCRIPTEN_RESULT_NOT_SUPPORTED) { return SDL_SetError("Gamepads not supported"); } /* handle already connected gamepads */ if (numjs > 0) { for(i = 0; i < numjs; i++) { retval = emscripten_get_gamepad_status(i, &gamepadState); if (retval == EMSCRIPTEN_RESULT_SUCCESS) { Emscripten_JoyStickConnected(EMSCRIPTEN_EVENT_GAMEPADCONNECTED, &gamepadState, NULL); } } } retval = emscripten_set_gamepadconnected_callback(NULL, 0, Emscripten_JoyStickConnected); if(retval != EMSCRIPTEN_RESULT_SUCCESS) { SDL_SYS_JoystickQuit(); return SDL_SetError("Could not set gamepad connect callback"); } retval = emscripten_set_gamepaddisconnected_callback(NULL, 0, Emscripten_JoyStickDisconnected); if(retval != EMSCRIPTEN_RESULT_SUCCESS) { SDL_SYS_JoystickQuit(); return SDL_SetError("Could not set gamepad disconnect callback"); } return 0; }
/* Function to perform any system-specific joystick related cleanup */ void SDL_SYS_JoystickQuit(void) { SDL_joylist_item *item = NULL; SDL_joylist_item *next = NULL; for (item = SDL_joylist; item; item = next) { next = item->next; SDL_free(item->mapping); SDL_free(item->name); SDL_free(item); } SDL_joylist = SDL_joylist_tail = NULL; numjoysticks = 0; instance_counter = 0; emscripten_set_gamepadconnected_callback(NULL, 0, NULL); emscripten_set_gamepaddisconnected_callback(NULL, 0, NULL); }