diff options
author | Tiago Vignatti <tiago.vignatti@intel.com> | 2012-03-27 21:26:01 +0300 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-03-27 16:36:54 -0400 |
commit | db4ecc61a717fae5eaa44dd374d2a9d9d8adf715 (patch) | |
tree | 0519bafe8a4b4d3cd82f516f2f200dcd472ca298 | |
parent | 7fb9f95dce600d0f6113ea0226ed5f10882c3de7 (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.c | 46 |
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 |