static void notify_output_destroy(struct wl_listener *listener, void *data) { struct evdev_device *device = container_of(listener, struct evdev_device, output_destroy_listener); struct weston_compositor *c = device->seat->compositor; struct weston_output *output; if (!device->output_name && !wl_list_empty(&c->output_list)) { output = container_of(c->output_list.next, struct weston_output, link); evdev_device_set_output(device, output); } else {
static void device_added(struct udev_input *input, struct libinput_device *libinput_device) { struct weston_compositor *c; struct evdev_device *device; struct weston_output *output; const char *output_name; struct weston_seat *seat; struct udev_seat *udev_seat; struct weston_pointer *pointer; c = input->compositor; udev_seat = get_udev_seat(input, libinput_device); if (!udev_seat) return; seat = &udev_seat->base; device = evdev_device_create(libinput_device, seat); if (device == NULL) return; if (input->configure_device != NULL) input->configure_device(c, device->device); evdev_device_set_calibration(device); udev_seat = (struct udev_seat *) seat; wl_list_insert(udev_seat->devices_list.prev, &device->link); pointer = weston_seat_get_pointer(seat); if (seat->output && pointer) weston_pointer_clamp(pointer, &pointer->x, &pointer->y); output_name = libinput_device_get_output_name(libinput_device); if (output_name) { device->output_name = strdup(output_name); wl_list_for_each(output, &c->output_list, link) if (output->name && strcmp(output->name, device->output_name) == 0) evdev_device_set_output(device, output); } else if (device->output == NULL && !wl_list_empty(&c->output_list)) {
static void device_added(struct udev_input *input, struct libinput_device *libinput_device) { struct weston_compositor *c; struct evdev_device *device; struct weston_output *output; const char *seat_name; const char *output_name; struct libinput_seat *libinput_seat; struct weston_seat *seat; struct udev_seat *udev_seat; c = input->compositor; libinput_seat = libinput_device_get_seat(libinput_device); seat_name = libinput_seat_get_logical_name(libinput_seat); udev_seat = udev_seat_get_named(input, seat_name); if (!udev_seat) return; seat = &udev_seat->base; device = evdev_device_create(libinput_device, seat); if (device == NULL) return; udev_seat = (struct udev_seat *) seat; wl_list_insert(udev_seat->devices_list.prev, &device->link); if (seat->output && seat->pointer) weston_pointer_clamp(seat->pointer, &seat->pointer->x, &seat->pointer->y); output_name = libinput_device_get_output_name(libinput_device); if (output_name) { device->output_name = strdup(output_name); wl_list_for_each(output, &c->output_list, link) if (strcmp(output->name, device->output_name) == 0) evdev_device_set_output(device, output); } else if (device->output == NULL) {
static int device_added(struct udev_device *udev_device, struct udev_input *input) { struct weston_compositor *c; struct evdev_device *device; struct weston_output *output; const char *devnode; const char *device_seat, *seat_name, *output_name; const char *calibration_values; int fd; struct udev_seat *seat; device_seat = udev_device_get_property_value(udev_device, "ID_SEAT"); if (!device_seat) device_seat = default_seat; if (strcmp(device_seat, input->seat_id)) return 0; c = input->compositor; devnode = udev_device_get_devnode(udev_device); /* Search for matching logical seat */ seat_name = udev_device_get_property_value(udev_device, "WL_SEAT"); if (!seat_name) seat_name = default_seat_name; seat = udev_seat_get_named(c, seat_name); if (seat == NULL) return -1; /* Use non-blocking mode so that we can loop on read on * evdev_device_data() until all events on the fd are * read. mtdev_get() also expects this. */ fd = weston_launcher_open(c->launcher, devnode, O_RDWR | O_NONBLOCK); if (fd < 0) { weston_log("opening input device '%s' failed.\n", devnode); return 0; } device = evdev_device_create(&seat->base, devnode, fd); if (device == EVDEV_UNHANDLED_DEVICE) { weston_launcher_close(c->launcher, fd); weston_log("not using input device '%s'.\n", devnode); return 0; } else if (device == NULL) { weston_launcher_close(c->launcher, fd); weston_log("failed to create input device '%s'.\n", devnode); return 0; } calibration_values = udev_device_get_property_value(udev_device, "WL_CALIBRATION"); if (calibration_values && sscanf(calibration_values, "%f %f %f %f %f %f", &device->abs.calibration[0], &device->abs.calibration[1], &device->abs.calibration[2], &device->abs.calibration[3], &device->abs.calibration[4], &device->abs.calibration[5]) == 6) { device->abs.apply_calibration = 1; weston_log ("Applying calibration: %f %f %f %f %f %f\n", device->abs.calibration[0], device->abs.calibration[1], device->abs.calibration[2], device->abs.calibration[3], device->abs.calibration[4], device->abs.calibration[5]); } wl_list_insert(seat->devices_list.prev, &device->link); if (seat->base.output && seat->base.pointer) weston_pointer_clamp(seat->base.pointer, &seat->base.pointer->x, &seat->base.pointer->y); output_name = udev_device_get_property_value(udev_device, "WL_OUTPUT"); if (output_name) { device->output_name = strdup(output_name); wl_list_for_each(output, &c->output_list, link) if (strcmp(output->name, device->output_name) == 0) evdev_device_set_output(device, output); } else if (device->output == NULL) {