summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Vignatti <tiago.vignatti@intel.com>2012-03-27 21:26:01 +0300
committerKristian Høgsberg <krh@bitplanet.net>2012-03-27 16:36:54 -0400
commitdb4ecc61a717fae5eaa44dd374d2a9d9d8adf715 (patch)
tree0519bafe8a4b4d3cd82f516f2f200dcd472ca298
parent7fb9f95dce600d0f6113ea0226ed5f10882c3de7 (diff)
evdev: reuse code for device removal
Just like device_added, now the routines to close the compositor and vt switch leave are using the same code to remove a device. This patch also closes properly a mtdev device, bug spotted by Christopher Michael. Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
-rw-r--r--src/evdev.c46
1 files changed, 21 insertions, 25 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 8642f51..5dbe6ac 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -544,23 +544,15 @@ device_added(struct udev_device *udev_device, struct evdev_input *master)
}
static void
-device_removed(struct udev_device *udev_device, struct evdev_input *master)
+device_removed(struct evdev_input_device *device)
{
- const char *devnode = udev_device_get_devnode(udev_device);
- struct evdev_input_device *device, *next;
-
- wl_list_for_each_safe(device, next, &master->devices_list, link) {
- if (!strcmp(device->devnode, devnode)) {
- wl_event_source_remove(device->source);
- wl_list_remove(&device->link);
- if (device->mtdev)
- mtdev_close_delete(device->mtdev);
- close(device->fd);
- free(device->devnode);
- free(device);
- break;
- }
- }
+ wl_event_source_remove(device->source);
+ wl_list_remove(&device->link);
+ if (device->mtdev)
+ mtdev_close_delete(device->mtdev);
+ close(device->fd);
+ free(device->devnode);
+ free(device);
}
void
@@ -604,7 +596,9 @@ evdev_udev_handler(int fd, uint32_t mask, void *data)
{
struct evdev_input *master = data;
struct udev_device *udev_device;
+ struct evdev_input_device *device, *next;
const char *action;
+ const char *devnode;
udev_device = udev_monitor_receive_device(master->udev_monitor);
if (!udev_device)
@@ -618,8 +612,15 @@ evdev_udev_handler(int fd, uint32_t mask, void *data)
if (!strcmp(action, "add")) {
device_added(udev_device, master);
}
- else if (!strcmp(action, "remove"))
- device_removed(udev_device, master);
+ else if (!strcmp(action, "remove")) {
+ devnode = udev_device_get_devnode(udev_device);
+ wl_list_for_each_safe(device, next,
+ &master->devices_list, link)
+ if (!strcmp(device->devnode, devnode)) {
+ device_removed(device);
+ break;
+ }
+ }
}
udev_device_unref(udev_device);
@@ -685,13 +686,8 @@ evdev_remove_devices(struct weston_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) {
- wl_event_source_remove(device->source);
- wl_list_remove(&device->link);
- close(device->fd);
- free(device->devnode);
- free(device);
- }
+ wl_list_for_each_safe(device, next, &input->devices_list, link)
+ device_removed(device);
}
void