const char* stjoystick_sys_get_name(int index) { int fd; static char namebuf[128]; char *name; SDL_logical_joydecl(int oindex = index); #ifndef NO_LOGICAL_JOYSTICKS SDL_joylist_head(index, index); #endif name = NULL; fd = open(SDL_joylist[index].fname, O_RDONLY, 0); if ( fd >= 0 ) { if ( #if SDL_INPUT_LINUXEV (ioctl(fd, EVIOCGNAME(sizeof(namebuf)), namebuf) <= 0) && #endif (ioctl(fd, JSIOCGNAME(sizeof(namebuf)), namebuf) <= 0) ) { name = SDL_joylist[index].fname; } else { name = namebuf; } close(fd); #ifndef NO_LOGICAL_JOYSTICKS if (SDL_joylist[oindex].prev || SDL_joylist[oindex].next || index!=oindex) { LogicalSuffix(SDL_joylist[oindex].logicalno, namebuf, 128); } #endif } return name; }
/* Function to close a joystick after use */ void STJoystick::Sys_Close(int device_index) { #ifndef NO_LOGICAL_JOYSTICKS register int i; if (SDL_joylist[device_index].fname == NULL) { SDL_joylist_head(i, device_index); Close(i); } #endif if ( joysticks[device_index]->hwdata ) { #ifndef NO_LOGICAL_JOYSTICKS if (SDL_joylist[device_index].fname != NULL) #endif close(joysticks[device_index]->hwdata->fd); if ( joysticks[device_index]->hwdata->hats ) { delete[] (joysticks[device_index]->hwdata->hats); } if ( joysticks[device_index]->hwdata->balls ) { delete[] (joysticks[device_index]->hwdata->balls); } delete (joysticks[device_index]->hwdata); joysticks[device_index]->hwdata = NULL; } }
/* Function to close a joystick after use */ void SDL_SYS_JoystickClose(SDL_Joystick *joystick) { #ifndef NO_LOGICAL_JOYSTICKS register int i; if (SDL_joylist[joystick->index].fname == NULL) { SDL_joylist_head(i, joystick->index); SDL_JoystickClose(SDL_joylist[i].joy); } #endif if ( joystick->hwdata ) { #ifndef NO_LOGICAL_JOYSTICKS if (SDL_joylist[joystick->index].fname != NULL) #endif close(joystick->hwdata->fd); if ( joystick->hwdata->hats ) { SDL_free(joystick->hwdata->hats); } if ( joystick->hwdata->balls ) { SDL_free(joystick->hwdata->balls); } SDL_free(joystick->hwdata); joystick->hwdata = NULL; } }
/* Function to update the state of a joystick - called as a device poll. * This function shouldn't update the joystick structure directly, * but instead should call SDL_PrivateJoystick*() to deliver events * and update joystick device state. */ static __inline__ void JS_HandleEvents(SDL_Joystick *joystick) { struct js_event events[32]; int i, len; Uint8 other_axis; #ifndef NO_LOGICAL_JOYSTICKS if (SDL_joylist[joystick->index].fname == NULL) { SDL_joylist_head(i, joystick->index); JS_HandleEvents(SDL_joylist[i].joy); return; } #endif while ((len=read(joystick->hwdata->fd, events, (sizeof events))) > 0) { len /= sizeof(events[0]); for ( i=0; i<len; ++i ) { switch (events[i].type & ~JS_EVENT_INIT) { case JS_EVENT_AXIS: if ( events[i].number < joystick->naxes ) { #ifndef NO_LOGICAL_JOYSTICKS if (!LogicalJoystickAxis(joystick, events[i].number, events[i].value)) #endif SDL_PrivateJoystickAxis(joystick, events[i].number, events[i].value); break; } events[i].number -= joystick->naxes; other_axis = (events[i].number / 2); if ( other_axis < joystick->nhats ) { HandleHat(joystick, other_axis, events[i].number%2, events[i].value); break; } events[i].number -= joystick->nhats*2; other_axis = (events[i].number / 2); if ( other_axis < joystick->nballs ) { HandleBall(joystick, other_axis, events[i].number%2, events[i].value); break; } break; case JS_EVENT_BUTTON: #ifndef NO_LOGICAL_JOYSTICKS if (!LogicalJoystickButton(joystick, events[i].number, events[i].value)) #endif SDL_PrivateJoystickButton(joystick, events[i].number, events[i].value); break; default: /* ?? */ break; } } } }
/* Function to open a joystick for use. The joystick to open is specified by the index field of the joystick. This should fill the nbuttons and naxes fields of the joystick structure. It returns 0, or -1 if there is an error. */ int SDL_SYS_JoystickOpen(SDL_Joystick *joystick) { int fd; SDL_logical_joydecl(int realindex); SDL_logical_joydecl(SDL_Joystick *realjoy = NULL); /* Open the joystick and set the joystick file descriptor */ #ifndef NO_LOGICAL_JOYSTICKS if (SDL_joylist[joystick->index].fname == NULL) { SDL_joylist_head(realindex, joystick->index); realjoy = SDL_JoystickOpen(realindex); if (realjoy == NULL) return(-1); fd = realjoy->hwdata->fd; } else { fd = open(SDL_joylist[joystick->index].fname, O_RDONLY, 0); } SDL_joylist[joystick->index].joy = joystick; #else fd = open(SDL_joylist[joystick->index].fname, O_RDONLY, 0); #endif if ( fd < 0 ) { SDL_SetError("Unable to open %s\n", SDL_joylist[joystick->index]); return(-1); } joystick->hwdata = (struct joystick_hwdata *) SDL_malloc(sizeof(*joystick->hwdata)); if ( joystick->hwdata == NULL ) { SDL_OutOfMemory(); close(fd); return(-1); } SDL_memset(joystick->hwdata, 0, sizeof(*joystick->hwdata)); joystick->hwdata->fd = fd; /* Set the joystick to non-blocking read mode */ fcntl(fd, F_SETFL, O_NONBLOCK); /* Get the number of buttons and axes on the joystick */ #ifndef NO_LOGICAL_JOYSTICKS if (realjoy) ConfigLogicalJoystick(joystick); else #endif #if SDL_INPUT_LINUXEV if ( ! EV_ConfigJoystick(joystick, fd) ) #endif JS_ConfigJoystick(joystick, fd); return(0); }
/* Function to open a joystick for use. The joystick to open is specified by the index field of the joystick. This should fill the nbuttons and naxes fields of the joystick structure. It returns 0, or -1 if there is an error. */ int STJoystick::Sys_OpenJoystick(int device_index) { int fd; SDL_logical_joydecl(int realindex); SDL_logical_joydecl(STJoystick::STJoystickData* realjoy = NULL); /* Open the joystick and set the joystick file descriptor */ #ifndef NO_LOGICAL_JOYSTICKS if (SDL_joylist[device_index].fname == NULL) { SDL_joylist_head(realindex, device_index); int opened_success = Sys_OpenJoystick(realindex); if (opened_success == -1) return(-1); realjoy = joysticks[device_index]; fd = realjoy->hwdata->fd; } else { fd = open(SDL_joylist[device_index].fname, O_RDONLY, 0); } SDL_joylist[device_index].joy = joysticks[device_index]; #else fd = open(SDL_joylist[device_index].fname, O_RDONLY, 0); #endif if ( fd < 0 ) { Error("Unable to open device in Sys_OpenJoystick()\n"); return(-1); } joysticks[device_index]->hwdata = new joystick_hwdata; if ( joysticks[device_index]->hwdata == NULL ) { MemoryError(); close(fd); return(-1); } memset(joysticks[device_index]->hwdata, 0, sizeof(*joysticks[device_index]->hwdata)); joysticks[device_index]->hwdata->fd = fd; /* Set the joystick to non-blocking read mode */ fcntl(fd, F_SETFL, O_NONBLOCK); /* Get the number of buttons and axes on the joystick */ #ifndef NO_LOGICAL_JOYSTICKS if (realjoy) ConfigLogicalJoystick(joysticks[device_index]); else #endif #if SDL_INPUT_LINUXEV if ( ! EV_ConfigJoystick(joysticks[device_index], fd) ) #endif JS_ConfigJoystick(joysticks[device_index], fd); return(0); }
static __inline__ void EV_HandleEvents(SDL_Joystick *joystick) { struct input_event events[32]; int i, len; int code; #ifndef NO_LOGICAL_JOYSTICKS if (SDL_joylist[joystick->index].fname == NULL) { SDL_joylist_head(i, joystick->index); return EV_HandleEvents(SDL_joylist[i].joy); } #endif while ((len=read(joystick->hwdata->fd, events, (sizeof events))) > 0) { len /= sizeof(events[0]); for ( i=0; i<len; ++i ) { code = events[i].code; switch (events[i].type) { case EV_KEY: if ( code >= BTN_MISC ) { code -= BTN_MISC; #ifndef NO_LOGICAL_JOYSTICKS if (!LogicalJoystickButton(joystick, joystick->hwdata->key_map[code], events[i].value)) #endif SDL_PrivateJoystickButton(joystick, joystick->hwdata->key_map[code], events[i].value); } break; case EV_ABS: switch (code) { case ABS_HAT0X: case ABS_HAT0Y: case ABS_HAT1X: case ABS_HAT1Y: case ABS_HAT2X: case ABS_HAT2Y: case ABS_HAT3X: case ABS_HAT3Y: code -= ABS_HAT0X; HandleHat(joystick, code/2, code%2, events[i].value); break; default: events[i].value = EV_AxisCorrect(joystick, code, events[i].value); #ifndef NO_LOGICAL_JOYSTICKS if (!LogicalJoystickAxis(joystick, joystick->hwdata->abs_map[code], events[i].value)) #endif SDL_PrivateJoystickAxis(joystick, joystick->hwdata->abs_map[code], events[i].value); break; } break; case EV_REL: switch (code) { case REL_X: case REL_Y: code -= REL_X; HandleBall(joystick, code/2, code%2, events[i].value); break; default: break; } break; default: break; } } } }