From 2ff4e113e237d9f461e41b994db6c53b5a66a3d0 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 9 Jun 2021 11:48:25 +0200 Subject: backend/session: introduce wlr_device_change_event This struct contains additional information for session device change events, such as the DRM connector ID that has changed. --- backend/session/session.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'backend/session') diff --git a/backend/session/session.c b/backend/session/session.c index b98f503d..382f3d60 100644 --- a/backend/session/session.c +++ b/backend/session/session.c @@ -139,6 +139,27 @@ static bool is_drm_card(const char *sysname) { return true; } +static void read_udev_change_event(struct wlr_device_change_event *event, + struct udev_device *udev_dev) { + const char *hotplug = udev_device_get_property_value(udev_dev, "HOTPLUG"); + if (hotplug != NULL && strcmp(hotplug, "1") == 0) { + event->type = WLR_DEVICE_HOTPLUG; + struct wlr_device_hotplug_event *hotplug = &event->hotplug; + + const char *connector = + udev_device_get_property_value(udev_dev, "CONNECTOR"); + if (connector != NULL) { + hotplug->connector_id = strtoul(connector, NULL, 10); + } + + const char *prop = + udev_device_get_property_value(udev_dev, "PROPERTY"); + if (prop != NULL) { + hotplug->prop_id = strtoul(prop, NULL, 10); + } + } +} + static int handle_udev_event(int fd, uint32_t mask, void *data) { struct wlr_session *session = data; @@ -180,7 +201,9 @@ static int handle_udev_event(int fd, uint32_t mask, void *data) { if (strcmp(action, "change") == 0) { wlr_log(WLR_DEBUG, "DRM device %s changed", sysname); - wlr_signal_emit_safe(&dev->events.change, NULL); + struct wlr_device_change_event event = {0}; + read_udev_change_event(&event, udev_dev); + wlr_signal_emit_safe(&dev->events.change, &event); } else if (strcmp(action, "remove") == 0) { wlr_log(WLR_DEBUG, "DRM device %s removed", sysname); wlr_signal_emit_safe(&dev->events.remove, NULL); -- cgit v1.2.3