/* * Open a controller for use - the index passed as an argument refers to * the N'th controller on the system. This index is the value which will * identify this controller in future controller events. * * This function returns a controller identifier, or NULL if an error occurred. */ SDL_GameController * SDL_GameControllerOpen(int device_index) { SDL_GameController *gamecontroller; SDL_GameController *gamecontrollerlist; ControllerMapping_t *pSupportedController = NULL; if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) { SDL_SetError("There are %d joysticks available", SDL_NumJoysticks()); return (NULL); } gamecontrollerlist = SDL_gamecontrollers; /* If the controller is already open, return it */ while ( gamecontrollerlist ) { if ( SDL_SYS_GetInstanceIdOfDeviceIndex(device_index) == gamecontrollerlist->joystick->instance_id ) { gamecontroller = gamecontrollerlist; ++gamecontroller->ref_count; return (gamecontroller); } gamecontrollerlist = gamecontrollerlist->next; } /* Find a controller mapping */ pSupportedController = SDL_PrivateGetControllerMapping(device_index); if ( !pSupportedController ) { SDL_SetError("Couldn't find mapping for device (%d)", device_index ); return (NULL); } /* Create and initialize the joystick */ gamecontroller = (SDL_GameController *) SDL_malloc((sizeof *gamecontroller)); if (gamecontroller == NULL) { SDL_OutOfMemory(); return NULL; } SDL_memset(gamecontroller, 0, (sizeof *gamecontroller)); gamecontroller->joystick = SDL_JoystickOpen(device_index); if ( !gamecontroller->joystick ) { SDL_free(gamecontroller); return NULL; } SDL_PrivateLoadButtonMapping( &gamecontroller->mapping, pSupportedController->guid, pSupportedController->name, pSupportedController->mapping ); /* Add joystick to list */ ++gamecontroller->ref_count; /* Link the joystick in the list */ gamecontroller->next = SDL_gamecontrollers; SDL_gamecontrollers = gamecontroller; SDL_SYS_JoystickUpdate( gamecontroller->joystick ); return (gamecontroller); }
void SDL_PrivateGameControllerRefreshMapping(ControllerMapping_t *pControllerMapping) { SDL_GameController *gamecontrollerlist = SDL_gamecontrollers; while (gamecontrollerlist) { if (!SDL_memcmp(&gamecontrollerlist->mapping.guid, &pControllerMapping->guid, sizeof(pControllerMapping->guid))) { SDL_Event event; event.type = SDL_CONTROLLERDEVICEREMAPPED; event.cdevice.which = gamecontrollerlist->joystick->instance_id; SDL_PushEvent(&event); /* Not really threadsafe. Should this lock access within SDL_GameControllerEventWatcher? */ SDL_PrivateLoadButtonMapping(&gamecontrollerlist->mapping, pControllerMapping->guid, pControllerMapping->name, pControllerMapping->mapping); } gamecontrollerlist = gamecontrollerlist->next; } }
/* * Open a controller for use - the index passed as an argument refers to * the N'th controller on the system. This index is the value which will * identify this controller in future controller events. * * This function returns a controller identifier, or NULL if an error occurred. */ SDL_GameController * SDL_GameControllerOpen(int device_index) { SDL_GameController *gamecontroller; SDL_GameController *gamecontrollerlist; ControllerMapping_t *pSupportedController = NULL; if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) { SDL_SetError("There are %d joysticks available", SDL_NumJoysticks()); return (NULL); } gamecontrollerlist = SDL_gamecontrollers; /* If the controller is already open, return it */ while (gamecontrollerlist) { if (SDL_SYS_GetInstanceIdOfDeviceIndex(device_index) == gamecontrollerlist->joystick->instance_id) { gamecontroller = gamecontrollerlist; ++gamecontroller->ref_count; return (gamecontroller); } gamecontrollerlist = gamecontrollerlist->next; } /* Find a controller mapping */ pSupportedController = SDL_PrivateGetControllerMapping(device_index); if (!pSupportedController) { SDL_SetError("Couldn't find mapping for device (%d)", device_index); return (NULL); } /* Create and initialize the joystick */ gamecontroller = (SDL_GameController *) SDL_malloc((sizeof *gamecontroller)); if (gamecontroller == NULL) { SDL_OutOfMemory(); return NULL; } SDL_memset(gamecontroller, 0, (sizeof *gamecontroller)); gamecontroller->joystick = SDL_JoystickOpen(device_index); if (!gamecontroller->joystick) { SDL_free(gamecontroller); return NULL; } SDL_PrivateLoadButtonMapping(&gamecontroller->mapping, pSupportedController->guid, pSupportedController->name, pSupportedController->mapping); /* The triggers are mapped from -32768 to 32767, where -32768 is the 'unpressed' value */ { int leftTriggerMapping = gamecontroller->mapping.axes[SDL_CONTROLLER_AXIS_TRIGGERLEFT]; int rightTriggerMapping = gamecontroller->mapping.axes[SDL_CONTROLLER_AXIS_TRIGGERRIGHT]; if (leftTriggerMapping >= 0) { gamecontroller->joystick->axes[leftTriggerMapping] = gamecontroller->joystick->axes_zero[leftTriggerMapping] = (Sint16)-32768; } if (rightTriggerMapping >= 0) { gamecontroller->joystick->axes[rightTriggerMapping] = gamecontroller->joystick->axes_zero[rightTriggerMapping] = (Sint16)-32768; } } /* Add joystick to list */ ++gamecontroller->ref_count; /* Link the joystick in the list */ gamecontroller->next = SDL_gamecontrollers; SDL_gamecontrollers = gamecontroller; SDL_SYS_JoystickUpdate(gamecontroller->joystick); return (gamecontroller); }