summaryrefslogtreecommitdiff
path: root/compositor
diff options
context:
space:
mode:
authorTiago Vignatti <tiago.vignatti@intel.com>2011-12-18 23:52:18 +0200
committerTiago Vignatti <tiago.vignatti@intel.com>2011-12-19 01:07:37 +0200
commitc349e1d0b009c9593cf90fff4cda55dfdea07dbc (patch)
treeeb72d01bbb94578a63c4752abd45e1abdb9f03a1 /compositor
parent0db1d5f55115caa06d4a6ccb2712ac912197878e (diff)
compositor-drm: destroy evdev driver properly when finishing compositor
Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
Diffstat (limited to 'compositor')
-rw-r--r--compositor/compositor-drm.c4
-rw-r--r--compositor/compositor.h3
-rw-r--r--compositor/evdev.c27
3 files changed, 34 insertions, 0 deletions
diff --git a/compositor/compositor-drm.c b/compositor/compositor-drm.c
index 4744a46a..9c8e506f 100644
--- a/compositor/compositor-drm.c
+++ b/compositor/compositor-drm.c
@@ -772,11 +772,15 @@ static void
drm_destroy(struct wlsc_compositor *ec)
{
struct drm_compositor *d = (struct drm_compositor *) ec;
+ struct wlsc_input_device *input, *next;
wlsc_compositor_shutdown(ec);
gbm_device_destroy(d->gbm);
tty_destroy(d->tty);
+ wl_list_for_each_safe(input, next, &ec->input_device_list, link)
+ evdev_input_destroy(input);
+
free(d);
}
diff --git a/compositor/compositor.h b/compositor/compositor.h
index 0b3f82e1..0c29de58 100644
--- a/compositor/compositor.h
+++ b/compositor/compositor.h
@@ -377,6 +377,9 @@ void
evdev_input_add_devices(struct wlsc_compositor *c,
struct udev *udev, const char *seat);
+void
+evdev_input_destroy(struct wlsc_input_device *input_base);
+
enum {
TTY_ENTER_VT,
TTY_LEAVE_VT
diff --git a/compositor/evdev.c b/compositor/evdev.c
index 43776c8a..25784506 100644
--- a/compositor/evdev.c
+++ b/compositor/evdev.c
@@ -537,3 +537,30 @@ evdev_input_add_devices(struct wlsc_compositor *c,
c->input_device = &input->base.input_device;
}
+
+static void
+evdev_remove_devices(struct wlsc_input_device *input_base)
+{
+ struct evdev_input *input = (struct evdev_input *) input_base;
+ struct evdev_input_device *device, *next;
+
+ wl_list_for_each_safe(device, next, &input->devices_list, link) {
+ fprintf(stderr, "evdev input device: removed: %s\n", device->devnode);
+ wl_event_source_remove(device->source);
+ wl_list_remove(&device->link);
+ close(device->fd);
+ free(device->devnode);
+ free(device);
+ }
+}
+
+void
+evdev_input_destroy(struct wlsc_input_device *input_base)
+{
+ struct evdev_input *input = (struct evdev_input *) input_base;
+
+ evdev_remove_devices(input_base);
+ wl_list_remove(&input->base.link);
+ free(input->seat_id);
+ free(input);
+}