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.
This commit is contained in:
parent
3e801d68f2
commit
2ff4e113e2
|
@ -139,6 +139,27 @@ static bool is_drm_card(const char *sysname) {
|
||||||
return true;
|
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) {
|
static int handle_udev_event(int fd, uint32_t mask, void *data) {
|
||||||
struct wlr_session *session = 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) {
|
if (strcmp(action, "change") == 0) {
|
||||||
wlr_log(WLR_DEBUG, "DRM device %s changed", sysname);
|
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) {
|
} else if (strcmp(action, "remove") == 0) {
|
||||||
wlr_log(WLR_DEBUG, "DRM device %s removed", sysname);
|
wlr_log(WLR_DEBUG, "DRM device %s removed", sysname);
|
||||||
wlr_signal_emit_safe(&dev->events.remove, NULL);
|
wlr_signal_emit_safe(&dev->events.remove, NULL);
|
||||||
|
|
|
@ -15,7 +15,7 @@ struct wlr_device {
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct wl_signal change;
|
struct wl_signal change; // struct wlr_device_change_event
|
||||||
struct wl_signal remove;
|
struct wl_signal remove;
|
||||||
} events;
|
} events;
|
||||||
};
|
};
|
||||||
|
@ -57,6 +57,22 @@ struct wlr_session_add_event {
|
||||||
const char *path;
|
const char *path;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum wlr_device_change_type {
|
||||||
|
WLR_DEVICE_HOTPLUG = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct wlr_device_hotplug_event {
|
||||||
|
uint32_t connector_id;
|
||||||
|
uint32_t prop_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct wlr_device_change_event {
|
||||||
|
enum wlr_device_change_type type;
|
||||||
|
union {
|
||||||
|
struct wlr_device_hotplug_event hotplug;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Opens a session, taking control of the current virtual terminal.
|
* Opens a session, taking control of the current virtual terminal.
|
||||||
* This should not be called if another program is already in control
|
* This should not be called if another program is already in control
|
||||||
|
|
Loading…
Reference in New Issue