/* * Close a joystick previously opened with SDL_JoystickOpen() */ void SDL_JoystickClose(SDL_Joystick * joystick) { SDL_Joystick *joysticklist; SDL_Joystick *joysticklistprev; if (!joystick) { return; } SDL_LockJoystickList(); /* First decrement ref count */ if (--joystick->ref_count > 0) { SDL_UnlockJoystickList(); return; } if (SDL_updating_joystick) { SDL_UnlockJoystickList(); return; } SDL_SYS_JoystickClose(joystick); joystick->hwdata = NULL; joysticklist = SDL_joysticks; joysticklistprev = NULL; while (joysticklist) { if (joystick == joysticklist) { if (joysticklistprev) { /* unlink this entry */ joysticklistprev->next = joysticklist->next; } else { SDL_joysticks = joystick->next; } break; } joysticklistprev = joysticklist; joysticklist = joysticklist->next; } SDL_free(joystick->name); /* Free the data associated with this joystick */ SDL_free(joystick->axes); SDL_free(joystick->hats); SDL_free(joystick->balls); SDL_free(joystick->buttons); SDL_free(joystick); SDL_UnlockJoystickList(); }
/* * Close a joystick previously opened with SDL_JoystickOpen() */ void SDL_JoystickClose(SDL_Joystick * joystick) { int i; if (!SDL_PrivateJoystickValid(&joystick)) { return; } /* First decrement ref count */ if (--joystick->ref_count > 0) { return; } /* Lock the event queue - prevent joystick polling */ SDL_Lock_EventThread(); if (joystick == default_joystick) { default_joystick = NULL; } SDL_SYS_JoystickClose(joystick); /* Remove joystick from list */ for (i = 0; SDL_joysticks[i]; ++i) { if (joystick == SDL_joysticks[i]) { SDL_memmove(&SDL_joysticks[i], &SDL_joysticks[i + 1], (SDL_numjoysticks - i) * sizeof(joystick)); break; } } /* Let the event thread keep running */ SDL_Unlock_EventThread(); /* Free the data associated with this joystick */ if (joystick->axes) { SDL_free(joystick->axes); } if (joystick->hats) { SDL_free(joystick->hats); } if (joystick->balls) { SDL_free(joystick->balls); } if (joystick->buttons) { SDL_free(joystick->buttons); } SDL_free(joystick); }
void SDL_JoystickClose(SDL_Joystick *joystick) { int i; if ( ! ValidJoystick(&joystick) ) { return; } if ( --joystick->ref_count > 0 ) { return; } SDL_Lock_EventThread(); SDL_SYS_JoystickClose(joystick); for ( i=0; SDL_joysticks[i]; ++i ) { if ( joystick == SDL_joysticks[i] ) { SDL_memmove(&SDL_joysticks[i], &SDL_joysticks[i+1], (SDL_allocatedjoysticks-i)*sizeof(joystick)); break; } } SDL_Unlock_EventThread(); if ( joystick->axes ) { SDL_free(joystick->axes); } if ( joystick->hats ) { SDL_free(joystick->hats); } if ( joystick->balls ) { SDL_free(joystick->balls); } if ( joystick->buttons ) { SDL_free(joystick->buttons); } SDL_free(joystick); }
int SDL_SYS_JoystickInit(void) { char s[16]; int i, fd; SDL_numjoysticks = 0; SDL_memset(joynames, 0, sizeof(joynames)); SDL_memset(joydevnames, 0, sizeof(joydevnames)); for (i = 0; i < MAX_UHID_JOYS; i++) { SDL_Joystick nj; SDL_snprintf(s, SDL_arraysize(s), "/dev/uhid%d", i); nj.index = SDL_numjoysticks; joynames[nj.index] = strdup(s); if (SDL_SYS_JoystickOpen(&nj) == 0) { SDL_SYS_JoystickClose(&nj); SDL_numjoysticks++; } else { SDL_free(joynames[nj.index]); joynames[nj.index] = NULL; } } for (i = 0; i < MAX_JOY_JOYS; i++) { SDL_snprintf(s, SDL_arraysize(s), "/dev/joy%d", i); fd = open(s, O_RDONLY); if (fd != -1) { joynames[SDL_numjoysticks++] = strdup(s); close(fd); } } /* Read the default USB HID usage table. */ hid_init(NULL); return (SDL_numjoysticks); }
/* * Close a joystick previously opened with SDL_JoystickOpen() */ void SDL_JoystickClose(SDL_Joystick * joystick) { int i; if (!SDL_PrivateJoystickValid(&joystick)) { return; } /* First decrement ref count */ if (--joystick->ref_count > 0) { return; } SDL_SYS_JoystickClose(joystick); /* Remove joystick from list */ for (i = 0; SDL_joysticks[i]; ++i) { if (joystick == SDL_joysticks[i]) { SDL_memmove(&SDL_joysticks[i], &SDL_joysticks[i + 1], (SDL_numjoysticks - i) * sizeof(joystick)); break; } } /* Free the data associated with this joystick */ if (joystick->axes) { SDL_free(joystick->axes); } if (joystick->hats) { SDL_free(joystick->hats); } if (joystick->balls) { SDL_free(joystick->balls); } if (joystick->buttons) { SDL_free(joystick->buttons); } SDL_free(joystick); }