// Factor this out because nothing else in IH_C::AddDevices() needs to know the type of the device. static HIDDevice *MakeDevice( InputDevice id ) { if( id == DEVICE_KEYBOARD ) return new KeyboardDevice; /* if( id == DEVICE_MOUSE ) return new MouseDevice; */ if( IsJoystick(id) ) return new JoystickDevice; if( IsPump(id) ) return new PumpDevice; return NULL; }
/* !!! FIXME: I would love to dump this code and use libudev instead. */ static int MaybeAddDevice(const char *path) { struct stat sb; int fd = -1; int isstick = 0; char namebuf[128]; SDL_JoystickGUID guid; SDL_joylist_item *item; if (path == NULL) { return -1; } if (stat(path, &sb) == -1) { return -1; } /* Check to make sure it's not already in list. */ for (item = SDL_joylist; item != NULL; item = item->next) { if (sb.st_rdev == item->devnum) { return -1; /* already have this one */ } } fd = open(path, O_RDONLY, 0); if (fd < 0) { return -1; } #ifdef DEBUG_INPUT_EVENTS printf("Checking %s\n", path); #endif isstick = IsJoystick(fd, namebuf, sizeof (namebuf), &guid); close(fd); if (!isstick) { return -1; } item = (SDL_joylist_item *) SDL_malloc(sizeof (SDL_joylist_item)); if (item == NULL) { return -1; } SDL_zerop(item); item->devnum = sb.st_rdev; item->path = SDL_strdup(path); item->name = SDL_strdup(namebuf); item->guid = guid; if ( (item->path == NULL) || (item->name == NULL) ) { SDL_free(item->path); SDL_free(item->name); SDL_free(item); return -1; } item->device_instance = instance_counter++; if (SDL_joylist_tail == NULL) { SDL_joylist = SDL_joylist_tail = item; } else { SDL_joylist_tail->next = item; SDL_joylist_tail = item; } /* Need to increment the joystick count before we post the event */ ++numjoysticks; SDL_PrivateJoystickAdded(numjoysticks - 1); return numjoysticks; }
/* !!! FIXME: I would love to dump this code and use libudev instead. */ static int MaybeAddDevice(const char *path) { struct stat sb; int fd = -1; int isstick = 0; char namebuf[128]; SDL_JoystickGUID guid; SDL_joylist_item *item; #if !SDL_EVENTS_DISABLED SDL_Event event; #endif if (path == NULL) { return -1; } if (stat(path, &sb) == -1) { return -1; } /* Check to make sure it's not already in list. */ for (item = SDL_joylist; item != NULL; item = item->next) { if (sb.st_rdev == item->devnum) { return -1; /* already have this one */ } } fd = open(path, O_RDONLY, 0); if (fd < 0) { return -1; } #ifdef DEBUG_INPUT_EVENTS printf("Checking %s\n", path); #endif isstick = IsJoystick(fd, namebuf, sizeof (namebuf), &guid); close(fd); if (!isstick) { return -1; } item = (SDL_joylist_item *) SDL_malloc(sizeof (SDL_joylist_item)); if (item == NULL) { return -1; } SDL_zerop(item); item->devnum = sb.st_rdev; item->path = SDL_strdup(path); item->name = SDL_strdup(namebuf); item->guid = guid; if ( (item->path == NULL) || (item->name == NULL) ) { SDL_free(item->path); SDL_free(item->name); SDL_free(item); return -1; } item->device_instance = instance_counter++; if (SDL_joylist_tail == NULL) { SDL_joylist = SDL_joylist_tail = item; } else { SDL_joylist_tail->next = item; SDL_joylist_tail = item; } /* Need to increment the joystick count before we post the event */ ++numjoysticks; /* !!! FIXME: Move this to an SDL_PrivateJoyDeviceAdded() function? */ #if !SDL_EVENTS_DISABLED event.type = SDL_JOYDEVICEADDED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = (numjoysticks - 1); if ( (SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event) ) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ return numjoysticks; }