aboutsummaryrefslogtreecommitdiff
path: root/backend/session
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2021-06-09 11:48:25 +0200
committerSimon Ser <contact@emersion.fr>2021-11-02 13:30:51 +0100
commit2ff4e113e237d9f461e41b994db6c53b5a66a3d0 (patch)
treecbb59eeb952f7301fa7ab76bb9a0e5c064a3a9db /backend/session
parent3e801d68f2c6c64567b1f24c6d03893f32c81197 (diff)
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.
Diffstat (limited to 'backend/session')
-rw-r--r--backend/session/session.c25
1 files changed, 24 insertions, 1 deletions
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);