summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compositor-drm.c8
-rw-r--r--src/evdev.c25
-rw-r--r--src/evdev.h6
3 files changed, 31 insertions, 8 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 27533ba..3ac1083 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -1498,8 +1498,10 @@ vt_func(struct weston_compositor *compositor, int event)
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;
@@ -1528,8 +1530,10 @@ vt_func(struct weston_compositor *compositor, int event)
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");
diff --git a/src/evdev.c b/src/evdev.c
index 9967e52..d328264 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -632,9 +632,10 @@ evdev_udev_handler(int fd, uint32_t mask, void *data)
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;
@@ -668,6 +669,20 @@ evdev_config_udev_monitor(struct udev *udev, struct evdev_input *master)
}
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)
{
@@ -682,7 +697,7 @@ evdev_input_create(struct weston_compositor *c, struct udev *udev,
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;
@@ -709,9 +724,7 @@ evdev_input_destroy(struct weston_input_device *input_base)
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);
diff --git a/src/evdev.h b/src/evdev.h
index af5f6d9..4e29814 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -33,3 +33,9 @@ evdev_input_create(struct weston_compositor *c, struct udev *udev,
void
evdev_input_destroy(struct weston_input_device *input_base);
+
+int
+evdev_enable_udev_monitor(struct udev *udev, struct weston_input_device *input_base);
+
+void
+evdev_disable_udev_monitor(struct weston_input_device *input_base);