summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2012-04-09 18:14:58 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2012-04-09 18:20:26 +0200
commit78d3afe21cdcd8ac284ad9bd08bc1948dd14496e (patch)
treea6d4790a1c43d72f8759fd9df86bb55135998942
parentbfeda130de340c090895d23ea0a5742521ff0078 (diff)
evdev: Disable the udev monitor when another vt becomes activevt-switch-hotplug
We dont want to receive hotplug events while being inactive. When getting back active we enumerate all devices and would end up with two sources for one device that may be hotplugged in the mean time.
-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);