From 5597776914d715903f1ac61d02b719941b0ac2b4 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 27 Dec 2020 12:54:35 +0100 Subject: [PATCH] backend/session: add wlr_device.events.remove --- backend/session/session.c | 20 +++++++++++++++----- include/wlr/backend/session.h | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/backend/session/session.c b/backend/session/session.c index 8ca858c8..71fe5166 100644 --- a/backend/session/session.c +++ b/backend/session/session.c @@ -139,7 +139,7 @@ static bool is_drm_card(const char *sysname) { return true; } -static int udev_event(int fd, uint32_t mask, void *data) { +static int handle_udev_event(int fd, uint32_t mask, void *data) { struct wlr_session *session = data; struct udev_device *udev_dev = udev_monitor_receive_device(session->mon); @@ -170,15 +170,24 @@ static int udev_event(int fd, uint32_t mask, void *data) { .path = devnode, }; wlr_signal_emit_safe(&session->events.add_drm_card, &event); - } else if (strcmp(action, "change") == 0) { + } else if (strcmp(action, "change") == 0 || strcmp(action, "remove") == 0) { dev_t devnum = udev_device_get_devnum(udev_dev); struct wlr_device *dev; wl_list_for_each(dev, &session->devices, link) { - if (dev->dev == devnum) { + if (dev->dev != devnum) { + continue; + } + + if (strcmp(action, "change") == 0) { wlr_log(WLR_DEBUG, "DRM device %s changed", sysname); wlr_signal_emit_safe(&dev->events.change, NULL); - break; + } else if (strcmp(action, "remove") == 0) { + wlr_log(WLR_DEBUG, "DRM device %s removed", sysname); + wlr_signal_emit_safe(&dev->events.remove, NULL); + } else { + assert(0); } + break; } } @@ -229,7 +238,7 @@ struct wlr_session *wlr_session_create(struct wl_display *disp) { int fd = udev_monitor_get_fd(session->mon); session->udev_event = wl_event_loop_add_fd(event_loop, fd, - WL_EVENT_READABLE, udev_event, session); + WL_EVENT_READABLE, handle_udev_event, session); if (!session->udev_event) { wlr_log_errno(WLR_ERROR, "Failed to create udev event source"); goto error_mon; @@ -299,6 +308,7 @@ struct wlr_device *wlr_session_open_file(struct wlr_session *session, dev->dev = st.st_rdev; dev->device_id = device_id; wl_signal_init(&dev->events.change); + wl_signal_init(&dev->events.remove); wl_list_insert(&session->devices, &dev->link); return dev; diff --git a/include/wlr/backend/session.h b/include/wlr/backend/session.h index 0c744673..0107ea36 100644 --- a/include/wlr/backend/session.h +++ b/include/wlr/backend/session.h @@ -16,6 +16,7 @@ struct wlr_device { struct { struct wl_signal change; + struct wl_signal remove; } events; };