compositor->state = ec->prev_state;
drm_compositor_set_modes(ec);
weston_compositor_damage_all(compositor);
- wl_list_for_each(input, &compositor->input_device_list, link)
+ wl_list_for_each(input, &compositor->input_device_list, link) {
evdev_add_devices(ec->udev, input);
+ evdev_enable_udev_monitor(ec->udev, input);
+ }
break;
case TTY_LEAVE_VT:
compositor->focus = 0;
drm_output->crtc_id, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0);
- wl_list_for_each(input, &compositor->input_device_list, link)
+ wl_list_for_each(input, &compositor->input_device_list, link) {
+ evdev_disable_udev_monitor(input);
evdev_remove_devices(input);
+ }
if (weston_launcher_drm_set_master(&ec->base, ec->drm.fd, 0) < 0)
fprintf(stderr, "failed to drop master: %m\n");
return 0;
}
-static int
-evdev_config_udev_monitor(struct udev *udev, struct evdev_input *master)
+int
+evdev_enable_udev_monitor(struct udev *udev, struct weston_input_device *input_base)
{
+ struct evdev_input *master = (struct evdev_input *) input_base;
struct wl_event_loop *loop;
struct weston_compositor *c = master->base.compositor;
int fd;
}
void
+evdev_disable_udev_monitor(struct weston_input_device *input_base)
+{
+ struct evdev_input *input = (struct evdev_input *) input_base;
+
+ if (!input->udev_monitor)
+ return;
+
+ udev_monitor_unref(input->udev_monitor);
+ input->udev_monitor = NULL;
+ wl_event_source_remove(input->udev_monitor_source);
+ input->udev_monitor_source = NULL;
+}
+
+void
evdev_input_create(struct weston_compositor *c, struct udev *udev,
const char *seat)
{
wl_list_init(&input->devices_list);
input->seat_id = strdup(seat);
- if (!evdev_config_udev_monitor(udev, input)) {
+ if (!evdev_enable_udev_monitor(udev, &input->base)) {
free(input->seat_id);
free(input);
return;
struct evdev_input *input = (struct evdev_input *) input_base;
evdev_remove_devices(input_base);
-
- udev_monitor_unref(input->udev_monitor);
- wl_event_source_remove(input->udev_monitor_source);
+ evdev_disable_udev_monitor(&input->base);
wl_list_remove(&input->base.link);
free(input->seat_id);