void SDL_SYS_JoystickDetect() { #if SDL_USE_LIBUDEV struct udev_device *dev = NULL; const char *devnode = NULL; const char *action = NULL; const char *val = NULL; while (HotplugUpdateAvailable()) { dev = UDEV_udev_monitor_receive_device(udev_mon); if (dev == NULL) { break; } val = UDEV_udev_device_get_property_value(dev, "ID_INPUT_JOYSTICK"); if ((!val) || (SDL_strcmp(val, "1") != 0)) { continue; } action = UDEV_udev_device_get_action(dev); devnode = UDEV_udev_device_get_devnode(dev); if (SDL_strcmp(action, "add") == 0) { const int device_index = MaybeAddDevice(devnode); if (device_index != -1) { /* !!! FIXME: Move this to an SDL_PrivateJoyDeviceAdded() function? */ #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEADDED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = device_index; if ( (SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event) ) { SDL_PushEvent(&event); } } #endif // !SDL_EVENTS_DISABLED } } else if (SDL_strcmp(action, "remove") == 0) { const int inst = MaybeRemoveDevice(devnode); if (inst != -1) { /* !!! FIXME: Move this to an SDL_PrivateJoyDeviceRemoved() function? */ #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = inst; if ( (SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event) ) { SDL_PushEvent(&event); } } #endif // !SDL_EVENTS_DISABLED } } UDEV_udev_device_unref(dev); } #endif }
/* Function to cause any queued joystick insertions to be processed */ void SDL_SYS_JoystickDetect() { while (CFRunLoopRunInMode(SDL_JOYSTICK_RUNLOOP_MODE,0,TRUE) == kCFRunLoopRunHandledSource) { /* no-op. Pending callbacks will fire in CFRunLoopRunInMode(). */ } if (s_bDeviceAdded || s_bDeviceRemoved) { recDevice *device = gpDeviceList; s_bDeviceAdded = SDL_FALSE; s_bDeviceRemoved = SDL_FALSE; int device_index = 0; /* send notifications */ while (device) { if (device->send_open_event) { device->send_open_event = 0; /* !!! FIXME: why isn't there an SDL_PrivateJoyDeviceAdded()? */ #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEADDED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = device_index; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ } if (device->removed) { const int instance_id = device->instance_id; device = FreeDevice(device); /* !!! FIXME: why isn't there an SDL_PrivateJoyDeviceRemoved()? */ #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = instance_id; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ } else { device = device->pNext; device_index++; } } } }
void joystick_udev_callback(SDL_UDEV_deviceevent udev_type, SDL_UDEV_deviceclass udev_class, const char *devpath) { int instance; if (devpath == NULL || udev_class != SDL_UDEV_DEVICE_JOYSTICK) { return; } switch( udev_type ) { case SDL_UDEV_DEVICEADDED: instance = MaybeAddDevice(devpath); if (instance != -1) { /* !!! FIXME: Move this to an SDL_PrivateJoyDeviceAdded() function? */ #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEADDED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = instance; if ( (SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event) ) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ } break; case SDL_UDEV_DEVICEREMOVED: instance = MaybeRemoveDevice(devpath); if (instance != -1) { /* !!! FIXME: Move this to an SDL_PrivateJoyDeviceRemoved() function? */ #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = instance; if ( (SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event) ) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ } break; default: break; } }
/* Function to cause any queued joystick insertions to be processed */ void SDL_SYS_JoystickDetect() { if (s_bDeviceAdded || s_bDeviceRemoved) { recDevice *device = gpDeviceList; s_bDeviceAdded = SDL_FALSE; s_bDeviceRemoved = SDL_FALSE; int device_index = 0; /* send notifications */ while (device) { if (device->send_open_event) { device->send_open_event = 0; /* !!! FIXME: why isn't there an SDL_PrivateJoyDeviceAdded()? */ #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEADDED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = device_index; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ } if (device->removed) { const int instance_id = device->instance_id; device = FreeDevice(device); /* !!! FIXME: why isn't there an SDL_PrivateJoyDeviceRemoved()? */ #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = instance_id; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ } else { device = device->pNext; device_index++; } } } }
static void JoystickDeviceWasRemovedCallback(void *ctx, IOReturn result, void *sender) { recDevice *device = (recDevice *) ctx; device->removed = SDL_TRUE; device->deviceRef = NULL; // deviceRef was invalidated due to the remove #if SDL_HAPTIC_IOKIT MacHaptic_MaybeRemoveDevice(device->ffservice); #endif /* !!! FIXME: why isn't there an SDL_PrivateJoyDeviceRemoved()? */ #if !SDL_EVENTS_DISABLED { SDL_Event event; event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = device->instance_id; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { SDL_PushEvent(&event); } } } #endif /* !SDL_EVENTS_DISABLED */ }
/* * Event filter to transform joystick events into appropriate game controller ones */ int SDL_PrivateGameControllerButton(SDL_GameController * gamecontroller, SDL_GameControllerButton button, Uint8 state) { int posted; #if !SDL_EVENTS_DISABLED SDL_Event event; if ( button == SDL_CONTROLLER_BUTTON_INVALID ) return (0); switch (state) { case SDL_PRESSED: event.type = SDL_CONTROLLERBUTTONDOWN; break; case SDL_RELEASED: event.type = SDL_CONTROLLERBUTTONUP; break; default: /* Invalid state -- bail */ return (0); } #endif /* !SDL_EVENTS_DISABLED */ /* translate the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.cbutton.which = gamecontroller->joystick->instance_id; event.cbutton.button = button; event.cbutton.state = state; posted = SDL_PushEvent(&event) == 1; } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
int SDL_SendProximity(int id, int x, int y, int type) { int index = SDL_GetMouseIndexId(id); SDL_Mouse *mouse = SDL_GetMouse(index); int posted = 0; if (!mouse) { return 0; } mouse->last_x = x; mouse->last_y = y; if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.proximity.which = (Uint8) index; event.proximity.x = x; event.proximity.y = y; event.proximity.cursor = mouse->current_end; event.proximity.type = type; /* FIXME: is this right? */ event.proximity.windowID = mouse->focus ? mouse->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); if (type == SDL_PROXIMITYIN) { mouse->proximity = SDL_TRUE; } else { mouse->proximity = SDL_FALSE; } } return posted; }
int SDL_PrivateJoystickBall(SDL_Joystick * joystick, Uint8 ball, Sint16 xrel, Sint16 yrel) { int posted; /* Make sure we're not getting garbage events */ if (ball >= joystick->nballs) { return 0; } /* We ignore events if we don't have keyboard focus. */ if (SDL_PrivateJoystickShouldIgnoreEvent()) { return 0; } /* Update internal mouse state */ joystick->balls[ball].dx += xrel; joystick->balls[ball].dy += yrel; /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(SDL_JOYBALLMOTION) == SDL_ENABLE) { SDL_Event event; event.jball.type = SDL_JOYBALLMOTION; event.jball.which = joystick->instance_id; event.jball.ball = ball; event.jball.xrel = xrel; event.jball.yrel = yrel; posted = SDL_PushEvent(&event) == 1; } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
/* Function to cause any queued joystick insertions to be processed */ void SDL_SYS_JoystickDetect() { if ( s_bDeviceAdded ) { recDevice *device = gpDeviceList; s_bDeviceAdded = SDL_FALSE; int device_index = 0; // send notifications while ( device ) { if ( device->send_open_event ) { device->send_open_event = 0; #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEADDED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = device_index; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ } device_index++; device = device->pNext; } } }
int SDL_PrivateJoystickBall(SDL_Joystick * joystick, Uint8 ball, Sint16 xrel, Sint16 yrel) { int posted; /* Update internal mouse state */ joystick->balls[ball].dx += xrel; joystick->balls[ball].dy += yrel; /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(SDL_JOYBALLMOTION) == SDL_ENABLE) { SDL_Event event; event.jball.type = SDL_JOYBALLMOTION; event.jball.which = joystick->index; event.jball.ball = ball; event.jball.xrel = xrel; event.jball.yrel = yrel; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { posted = 1; SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
int SDL_PrivateJoystickAxis(SDL_Joystick * joystick, Uint8 axis, Sint16 value) { int posted; /* Update internal joystick state */ joystick->axes[axis] = value; /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(SDL_JOYAXISMOTION) == SDL_ENABLE) { SDL_Event event; event.type = SDL_JOYAXISMOTION; event.jaxis.which = joystick->index; event.jaxis.axis = axis; event.jaxis.value = value; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { posted = 1; SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
int SDL_PrivateJoystickHat(SDL_Joystick * joystick, Uint8 hat, Uint8 value) { int posted; /* Update internal joystick state */ joystick->hats[hat] = value; /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(SDL_JOYHATMOTION) == SDL_ENABLE) { SDL_Event event; event.jhat.type = SDL_JOYHATMOTION; event.jhat.which = joystick->index; event.jhat.hat = hat; event.jhat.value = value; if ((SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event)) { posted = 1; SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
int SDL_SendDisplayEvent(SDL_VideoDisplay *display, Uint8 displayevent, int data1) { int posted; if (!display) { return 0; } switch (displayevent) { case SDL_DISPLAYEVENT_ORIENTATION: if (data1 == SDL_ORIENTATION_UNKNOWN || data1 == display->orientation) { return 0; } display->orientation = (SDL_DisplayOrientation)data1; break; } /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(SDL_DISPLAYEVENT) == SDL_ENABLE) { SDL_Event event; event.type = SDL_DISPLAYEVENT; event.display.event = displayevent; event.display.display = SDL_GetIndexOfDisplay(display); event.display.data1 = data1; posted = (SDL_PushEvent(&event) > 0); } return (posted); }
int SDL_SendMouseWheel(SDL_Window * window, SDL_MouseID mouseID, int x, int y) { SDL_Mouse *mouse = SDL_GetMouse(); int posted; if (window) { SDL_SetMouseFocus(window); } if (!x && !y) { return 0; } /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(SDL_MOUSEWHEEL) == SDL_ENABLE) { SDL_Event event; event.type = SDL_MOUSEWHEEL; event.wheel.windowID = mouse->focus ? mouse->focus->id : 0; event.wheel.which = mouseID; event.wheel.x = x; event.wheel.y = y; posted = (SDL_PushEvent(&event) > 0); } return posted; }
int Android_RemoveJoystick(int device_id) { SDL_joylist_item *item = SDL_joylist; SDL_joylist_item *prev = NULL; #if !SDL_EVENTS_DISABLED SDL_Event event; #endif /* Don't call JoystickByDeviceId here or there'll be an infinite loop! */ while (item != NULL) { if (item->device_id == device_id) { break; } prev = item; item = item->next; } if (item == NULL) { return -1; } const int retval = item->device_instance; if (item->joystick) { item->joystick->hwdata = NULL; } if (prev != NULL) { prev->next = item->next; } else { SDL_assert(SDL_joylist == item); SDL_joylist = item->next; } if (item == SDL_joylist_tail) { SDL_joylist_tail = prev; } /* Need to decrement the joystick count before we post the event */ --numjoysticks; #if !SDL_EVENTS_DISABLED event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = item->device_instance; if ( (SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event) ) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ SDL_Log("Removed joystick with device_id %d", device_id); SDL_free(item->name); SDL_free(item); return retval; }
/* !!! FIXME: I would love to dump this code and use libudev instead. */ static int MaybeRemoveDevice(const char *path) { SDL_joylist_item *item; SDL_joylist_item *prev = NULL; #if !SDL_EVENTS_DISABLED SDL_Event event; #endif if (path == NULL) { return -1; } for (item = SDL_joylist; item != NULL; item = item->next) { /* found it, remove it. */ if (SDL_strcmp(path, item->path) == 0) { const int retval = item->device_instance; if (item->hwdata) { item->hwdata->item = NULL; } if (prev != NULL) { prev->next = item->next; } else { SDL_assert(SDL_joylist == item); SDL_joylist = item->next; } if (item == SDL_joylist_tail) { SDL_joylist_tail = prev; } /* Need to decrement the joystick count before we post the event */ --numjoysticks; /* !!! FIXME: Move this to an SDL_PrivateJoyDeviceRemoved() function? */ #if !SDL_EVENTS_DISABLED event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = item->device_instance; if ( (SDL_EventOK == NULL) || (*SDL_EventOK) (SDL_EventOKParam, &event) ) { SDL_PushEvent(&event); } } #endif /* !SDL_EVENTS_DISABLED */ SDL_free(item->path); SDL_free(item->name); SDL_free(item); return retval; } prev = item; } return -1; }
int SDL_PrivateJoystickAxis(SDL_Joystick * joystick, Uint8 axis, Sint16 value) { int posted; /* Make sure we're not getting garbage or duplicate events */ if (axis >= joystick->naxes) { return 0; } if (!joystick->axes[axis].has_initial_value) { joystick->axes[axis].initial_value = value; joystick->axes[axis].value = value; joystick->axes[axis].zero = value; joystick->axes[axis].has_initial_value = SDL_TRUE; } if (value == joystick->axes[axis].value) { return 0; } if (!joystick->axes[axis].sent_initial_value) { /* Make sure we don't send motion until there's real activity on this axis */ const int MAX_ALLOWED_JITTER = SDL_JOYSTICK_AXIS_MAX / 80; /* ShanWan PS3 controller needed 96 */ if (SDL_abs(value - joystick->axes[axis].value) <= MAX_ALLOWED_JITTER) { return 0; } joystick->axes[axis].sent_initial_value = SDL_TRUE; joystick->axes[axis].value = value; /* Just so we pass the check above */ SDL_PrivateJoystickAxis(joystick, axis, joystick->axes[axis].initial_value); } /* We ignore events if we don't have keyboard focus, except for centering * events. */ if (SDL_PrivateJoystickShouldIgnoreEvent()) { if ((value > joystick->axes[axis].zero && value >= joystick->axes[axis].value) || (value < joystick->axes[axis].zero && value <= joystick->axes[axis].value)) { return 0; } } /* Update internal joystick state */ joystick->axes[axis].value = value; /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(SDL_JOYAXISMOTION) == SDL_ENABLE) { SDL_Event event; event.type = SDL_JOYAXISMOTION; event.jaxis.which = joystick->instance_id; event.jaxis.axis = axis; event.jaxis.value = value; posted = SDL_PushEvent(&event) == 1; } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
int SDL_SendMouseButton(SDL_Window * window, SDL_MouseID mouseID, Uint8 state, Uint8 button) { SDL_Mouse *mouse = SDL_GetMouse(); int posted; Uint32 type; Uint32 buttonstate = mouse->buttonstate; /* Figure out which event to perform */ switch (state) { case SDL_PRESSED: type = SDL_MOUSEBUTTONDOWN; buttonstate |= SDL_BUTTON(button); break; case SDL_RELEASED: type = SDL_MOUSEBUTTONUP; buttonstate &= ~SDL_BUTTON(button); break; default: /* Invalid state -- bail */ return 0; } /* We do this after calculating buttonstate so button presses gain focus */ if (window && state == SDL_PRESSED) { SDL_UpdateMouseFocus(window, mouse->x, mouse->y, buttonstate); } if (buttonstate == mouse->buttonstate) { /* Ignore this event, no state change */ return 0; } mouse->buttonstate = buttonstate; /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.type = type; event.button.windowID = mouse->focus ? mouse->focus->id : 0; event.button.which = mouseID; event.button.state = state; event.button.button = button; event.button.x = mouse->x; event.button.y = mouse->y; posted = (SDL_PushEvent(&event) > 0); } /* We do this after dispatching event so button releases can lose focus */ if (window && state == SDL_RELEASED) { SDL_UpdateMouseFocus(window, mouse->x, mouse->y, buttonstate); } return posted; }
int SDL_SendMouseWheel(SDL_Window * window, SDL_MouseID mouseID, float x, float y, SDL_MouseWheelDirection direction) { SDL_Mouse *mouse = SDL_GetMouse(); int posted; int integral_x, integral_y; if (window) { SDL_SetMouseFocus(window); } if (x == 0.0f && y == 0.0f) { return 0; } mouse->accumulated_wheel_x += x; if (mouse->accumulated_wheel_x > 0) { integral_x = (int)SDL_floor(mouse->accumulated_wheel_x); } else if (mouse->accumulated_wheel_x < 0) { integral_x = (int)SDL_ceil(mouse->accumulated_wheel_x); } else { integral_x = 0; } mouse->accumulated_wheel_x -= integral_x; mouse->accumulated_wheel_y += y; if (mouse->accumulated_wheel_y > 0) { integral_y = (int)SDL_floor(mouse->accumulated_wheel_y); } else if (mouse->accumulated_wheel_y < 0) { integral_y = (int)SDL_ceil(mouse->accumulated_wheel_y); } else { integral_y = 0; } mouse->accumulated_wheel_y -= integral_y; /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(SDL_MOUSEWHEEL) == SDL_ENABLE) { SDL_Event event; event.type = SDL_MOUSEWHEEL; event.wheel.windowID = mouse->focus ? mouse->focus->id : 0; event.wheel.which = mouseID; #if 0 /* Uncomment this when it goes in for SDL 2.1 */ event.wheel.preciseX = x; event.wheel.preciseY = y; #endif event.wheel.x = integral_x; event.wheel.y = integral_y; event.wheel.direction = (Uint32)direction; posted = (SDL_PushEvent(&event) > 0); } return posted; }
int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, float x, float y, float pressure) { SDL_Touch *touch; SDL_Finger *finger; int posted; float xrel, yrel, prel; touch = SDL_GetTouch(id); if (!touch) { return -1; } finger = SDL_GetFinger(touch,fingerid); if (!finger) { return SDL_SendTouch(id, fingerid, SDL_TRUE, x, y, pressure); } xrel = x - finger->x; yrel = y - finger->y; prel = pressure - finger->pressure; /* Drop events that don't change state */ if (!xrel && !yrel && !prel) { #if 0 printf("Touch event didn't change state - dropped!\n"); #endif return 0; } /* Update internal touch coordinates */ finger->x = x; finger->y = y; finger->pressure = pressure; /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) { SDL_Event event; event.tfinger.type = SDL_FINGERMOTION; event.tfinger.touchId = id; event.tfinger.fingerId = fingerid; event.tfinger.x = x; event.tfinger.y = y; event.tfinger.dx = xrel; event.tfinger.dy = yrel; event.tfinger.pressure = pressure; posted = (SDL_PushEvent(&event) > 0); } return posted; }
void SDL_PrivateJoystickAdded(int device_index) { #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEADDED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = device_index; SDL_PushEvent(&event); } #endif /* !SDL_EVENTS_DISABLED */ }
/* This function returns 1 if it's okay to close the application window */ int SDL_SendQuit(void) { int posted; posted = 0; if (SDL_GetEventState(SDL_QUIT) == SDL_ENABLE) { SDL_Event event; event.type = SDL_QUIT; posted = (SDL_PushEvent(&event) > 0); } return (posted); }
int SDL_PrivateJoystickButton(SDL_Joystick * joystick, Uint8 button, Uint8 state) { int posted; #if !SDL_EVENTS_DISABLED SDL_Event event; switch (state) { case SDL_PRESSED: event.type = SDL_JOYBUTTONDOWN; break; case SDL_RELEASED: event.type = SDL_JOYBUTTONUP; break; default: /* Invalid state -- bail */ return (0); } #endif /* !SDL_EVENTS_DISABLED */ /* Make sure we're not getting garbage or duplicate events */ if (button >= joystick->nbuttons) { return 0; } if (state == joystick->buttons[button]) { return 0; } /* We ignore events if we don't have keyboard focus, except for button * release. */ if (SDL_PrivateJoystickShouldIgnoreEvent()) { if (state == SDL_PRESSED) { return 0; } } /* Update internal joystick state */ joystick->buttons[button] = state; /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jbutton.which = joystick->instance_id; event.jbutton.button = button; event.jbutton.state = state; posted = SDL_PushEvent(&event) == 1; } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
int SDL_SendMouseButton(int id, Uint8 state, Uint8 button) { int index = SDL_GetMouseIndexId(id); SDL_Mouse *mouse = SDL_GetMouse(index); int posted; Uint32 type; if (!mouse) { return 0; } /* Figure out which event to perform */ switch (state) { case SDL_PRESSED: if (mouse->buttonstate & SDL_BUTTON(button)) { /* Ignore this event, no state change */ return 0; } type = SDL_MOUSEBUTTONDOWN; mouse->buttonstate |= SDL_BUTTON(button); break; case SDL_RELEASED: if (!(mouse->buttonstate & SDL_BUTTON(button))) { /* Ignore this event, no state change */ return 0; } type = SDL_MOUSEBUTTONUP; mouse->buttonstate &= ~SDL_BUTTON(button); break; default: /* Invalid state -- bail */ return 0; } /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.type = type; event.button.which = (Uint8) index; event.button.state = state; event.button.button = button; event.button.x = mouse->x; event.button.y = mouse->y; event.button.windowID = mouse->focus ? mouse->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); } return posted; }
int SDL_SendTouchButton(SDL_TouchID id, Uint8 state, Uint8 button) { SDL_Touch *touch; int posted; Uint32 type; touch = SDL_GetTouch(id); if (!touch) { return SDL_TouchNotFoundError(id); } /* Figure out which event to perform */ switch (state) { case SDL_PRESSED: if (touch->buttonstate & SDL_BUTTON(button)) { /* Ignore this event, no state change */ return 0; } type = SDL_TOUCHBUTTONDOWN; touch->buttonstate |= SDL_BUTTON(button); break; case SDL_RELEASED: if (!(touch->buttonstate & SDL_BUTTON(button))) { /* Ignore this event, no state change */ return 0; } type = SDL_TOUCHBUTTONUP; touch->buttonstate &= ~SDL_BUTTON(button); break; default: /* Invalid state -- bail */ return 0; } /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.type = type; event.tbutton.touchId = touch->id; event.tbutton.state = state; event.tbutton.button = button; event.tbutton.windowID = touch->focus ? touch->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); } return posted; }
int SDL_SendDropFile(const char *file) { int posted; /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(SDL_DROPFILE) == SDL_ENABLE) { SDL_Event event; event.type = SDL_DROPFILE; event.drop.file = SDL_strdup(file); posted = (SDL_PushEvent(&event) > 0); } return (posted); }
void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance) { #if !SDL_EVENTS_DISABLED SDL_Event event; event.type = SDL_JOYDEVICEREMOVED; if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jdevice.which = device_instance; SDL_PushEvent(&event); } UpdateEventsForDeviceRemoval(); #endif /* !SDL_EVENTS_DISABLED */ }
/* * Event filter to transform joystick events into appropriate game controller ones */ int SDL_PrivateGameControllerAxis(SDL_GameController * gamecontroller, SDL_GameControllerAxis axis, Sint16 value) { int posted; /* translate the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(SDL_CONTROLLERAXISMOTION) == SDL_ENABLE) { SDL_Event event; event.type = SDL_CONTROLLERAXISMOTION; event.caxis.which = gamecontroller->joystick->instance_id; event.caxis.axis = axis; event.caxis.value = value; posted = SDL_PushEvent(&event) == 1; } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
int SDL_PrivateJoystickAxis(SDL_Joystick * joystick, Uint8 axis, Sint16 value) { int posted; /* Make sure we're not getting garbage or duplicate events */ if (axis >= joystick->naxes) { return 0; } if (value == joystick->axes[axis]) { return 0; } /* We ignore events if we don't have keyboard focus, except for centering * events. */ if (SDL_PrivateJoystickShouldIgnoreEvent()) { if ((value > joystick->axes_zero[axis] && value >= joystick->axes[axis]) || (value < joystick->axes_zero[axis] && value <= joystick->axes[axis])) { return 0; } } /* Update internal joystick state */ joystick->axes[axis] = value; /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(SDL_JOYAXISMOTION) == SDL_ENABLE) { SDL_Event event; event.type = SDL_JOYAXISMOTION; event.jaxis.which = joystick->instance_id; event.jaxis.axis = axis; event.jaxis.value = value; posted = SDL_PushEvent(&event) == 1; } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }
int SDL_PrivateJoystickHat(SDL_Joystick * joystick, Uint8 hat, Uint8 value) { int posted; /* Make sure we're not getting garbage or duplicate events */ if (hat >= joystick->nhats) { return 0; } if (value == joystick->hats[hat]) { return 0; } /* We ignore events if we don't have keyboard focus, except for centering * events. */ if (SDL_PrivateJoystickShouldIgnoreEvent()) { if (value != SDL_HAT_CENTERED) { return 0; } } /* Update internal joystick state */ joystick->hats[hat] = value; /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED if (SDL_GetEventState(SDL_JOYHATMOTION) == SDL_ENABLE) { SDL_Event event; event.jhat.type = SDL_JOYHATMOTION; event.jhat.which = joystick->instance_id; event.jhat.hat = hat; event.jhat.value = value; posted = SDL_PushEvent(&event) == 1; } #endif /* !SDL_EVENTS_DISABLED */ return (posted); }