22 #include "../../SDL_internal.h" 24 #ifdef SDL_JOYSTICK_EMSCRIPTEN 30 #if !SDL_EVENTS_DISABLED 31 #include "../../events/SDL_events_c.h" 39 #include "SDL_sysjoystick_c.h" 40 #include "../SDL_joystick_c.h" 42 static SDL_joylist_item * JoystickByIndex(
int index);
44 static SDL_joylist_item *SDL_joylist =
NULL;
45 static SDL_joylist_item *SDL_joylist_tail =
NULL;
47 static int instance_counter = 0;
50 Emscripten_JoyStickConnected(
int eventType,
const EmscriptenGamepadEvent *gamepadEvent,
void *userData)
54 SDL_joylist_item *item;
56 if (JoystickByIndex(gamepadEvent->index) !=
NULL) {
60 #if !SDL_EVENTS_DISABLED 64 item = (SDL_joylist_item *)
SDL_malloc(
sizeof (SDL_joylist_item));
70 item->index = gamepadEvent->index;
73 if ( item->name ==
NULL ) {
78 item->mapping =
SDL_strdup(gamepadEvent->mapping);
79 if ( item->mapping ==
NULL ) {
85 item->naxes = gamepadEvent->numAxes;
86 item->nbuttons = gamepadEvent->numButtons;
87 item->device_instance = instance_counter++;
89 item->timestamp = gamepadEvent->timestamp;
91 for( i = 0; i < item->naxes; i++) {
92 item->axis[
i] = gamepadEvent->axis[
i];
95 for( i = 0; i < item->nbuttons; i++) {
96 item->analogButton[
i] = gamepadEvent->analogButton[
i];
97 item->digitalButton[
i] = gamepadEvent->digitalButton[
i];
100 if (SDL_joylist_tail ==
NULL) {
101 SDL_joylist = SDL_joylist_tail = item;
103 SDL_joylist_tail->next = item;
104 SDL_joylist_tail = item;
108 #ifdef DEBUG_JOYSTICK 111 #if !SDL_EVENTS_DISABLED 123 #ifdef DEBUG_JOYSTICK 124 SDL_Log(
"Added joystick with index %d", item->index);
131 Emscripten_JoyStickDisconnected(
int eventType,
const EmscriptenGamepadEvent *gamepadEvent,
void *userData)
133 SDL_joylist_item *item = SDL_joylist;
134 SDL_joylist_item *prev =
NULL;
135 #if !SDL_EVENTS_DISABLED 139 while (item !=
NULL) {
140 if (item->index == gamepadEvent->index) {
151 if (item->joystick) {
152 item->joystick->hwdata =
NULL;
156 prev->next = item->next;
159 SDL_joylist = item->next;
161 if (item == SDL_joylist_tail) {
162 SDL_joylist_tail = prev;
168 #if !SDL_EVENTS_DISABLED 172 event.jdevice.which = item->device_instance;
180 #ifdef DEBUG_JOYSTICK 181 SDL_Log(
"Removed joystick with id %d", item->device_instance);
196 EmscriptenGamepadEvent gamepadState;
199 numjs = emscripten_get_num_gamepads();
202 if (numjs == EMSCRIPTEN_RESULT_NOT_SUPPORTED) {
208 for(i = 0; i < numjs; i++) {
209 retval = emscripten_get_gamepad_status(i, &gamepadState);
210 if (retval == EMSCRIPTEN_RESULT_SUCCESS) {
211 Emscripten_JoyStickConnected(EMSCRIPTEN_EVENT_GAMEPADCONNECTED,
218 retval = emscripten_set_gamepadconnected_callback(
NULL,
220 Emscripten_JoyStickConnected);
222 if(retval != EMSCRIPTEN_RESULT_SUCCESS) {
224 return SDL_SetError(
"Could not set gamepad connect callback");
227 retval = emscripten_set_gamepaddisconnected_callback(
NULL,
229 Emscripten_JoyStickDisconnected);
230 if(retval != EMSCRIPTEN_RESULT_SUCCESS) {
232 return SDL_SetError(
"Could not set gamepad disconnect callback");
239 static SDL_joylist_item *
240 JoystickByDeviceIndex(
int device_index)
242 SDL_joylist_item *item = SDL_joylist;
244 while (0 < device_index) {
253 static SDL_joylist_item *
254 JoystickByIndex(
int index)
256 SDL_joylist_item *item = SDL_joylist;
262 while (item !=
NULL) {
263 if (item->index == index) {
285 return JoystickByDeviceIndex(device_index)->name;
291 return JoystickByDeviceIndex(device_index)->device_instance;
302 SDL_joylist_item *item = JoystickByDeviceIndex(device_index);
308 if (item->joystick !=
NULL) {
312 joystick->instance_id = item->device_instance;
318 joystick->nballs = 0;
320 joystick->nbuttons = item->nbuttons;
321 joystick->naxes = item->naxes;
329 return joystick->hwdata !=
NULL;
340 EmscriptenGamepadEvent gamepadState;
341 SDL_joylist_item *item = (SDL_joylist_item *) joystick->hwdata;
342 int i,
result, buttonState;
345 result = emscripten_get_gamepad_status(item->index, &gamepadState);
346 if(
result == EMSCRIPTEN_RESULT_SUCCESS) {
347 if(gamepadState.timestamp == 0 || gamepadState.timestamp != item->timestamp) {
348 for(i = 0; i < item->nbuttons; i++) {
349 if(item->digitalButton[i] != gamepadState.digitalButton[i]) {
355 item->analogButton[
i] = gamepadState.analogButton[
i];
356 item->digitalButton[
i] = gamepadState.digitalButton[
i];
359 for(i = 0; i < item->naxes; i++) {
360 if(item->axis[i] != gamepadState.axis[i]) {
363 (
Sint16) (32767.*gamepadState.axis[i]));
367 item->axis[
i] = gamepadState.axis[
i];
370 item->timestamp = gamepadState.timestamp;
386 SDL_joylist_item *item =
NULL;
389 for (item = SDL_joylist;
item; item =
next) {
396 SDL_joylist = SDL_joylist_tail =
NULL;
399 instance_counter = 0;
401 emscripten_set_gamepadconnected_callback(
NULL, 0,
NULL);
402 emscripten_set_gamepaddisconnected_callback(
NULL, 0,
NULL);
421 const char *name = joystick->name;
int SDL_SYS_NumJoysticks()
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
struct joystick_hwdata * next
GLuint const GLchar * name
void SDL_SYS_JoystickQuit(void)
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
#define SDL_GetEventState(type)
SDL_bool SDL_SYS_JoystickAttached(SDL_Joystick *joystick)
SDL_EventFilter SDL_EventOK
void SDL_SYS_JoystickDetect()
const char * SDL_SYS_JoystickNameForDeviceIndex(int device_index)
void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
SDL_JoystickGUID SDL_SYS_JoystickGetGUID(SDL_Joystick *joystick)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
#define SDL_assert(condition)
int SDL_SYS_JoystickInit(void)
struct SDL_joylist_item * item
SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
int SDL_SYS_JoystickOpen(SDL_Joystick *joystick, int device_index)
void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID(int device_index)
int16_t Sint16
A signed 16-bit integer type.