summaryrefslogtreecommitdiff
path: root/src/compositor-drm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compositor-drm.c')
-rw-r--r--src/compositor-drm.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 67fa500..27d4512 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -50,6 +50,7 @@ struct drm_compositor {
struct wl_event_source *udev_drm_source;
struct {
+ int id;
int fd;
} drm;
struct gbm_device *gbm;
@@ -759,13 +760,21 @@ static int
init_egl(struct drm_compositor *ec, struct udev_device *device)
{
EGLint major, minor;
- const char *extensions, *filename;
+ const char *extensions, *filename, *sysnum;
int fd;
static const EGLint context_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
+ sysnum = udev_device_get_sysnum(device);
+ if (sysnum)
+ ec->drm.id = atoi(sysnum);
+ if (!sysnum || ec->drm.id < 0) {
+ fprintf(stderr, "cannot get device sysnum\n");
+ return -1;
+ }
+
filename = udev_device_get_devnode(device);
fd = open(filename, O_RDWR | O_CLOEXEC);
if (fd < 0) {
@@ -1385,9 +1394,14 @@ update_outputs(struct drm_compositor *ec, struct udev_device *drm_device)
}
static int
-udev_event_is_hotplug(struct udev_device *device)
+udev_event_is_hotplug(struct drm_compositor *ec, struct udev_device *device)
{
struct udev_list_entry *list, *hotplug_entry;
+ const char *sysnum;
+
+ sysnum = udev_device_get_sysnum(device);
+ if (!sysnum || atoi(sysnum) != ec->drm.id)
+ return 0;
list = udev_device_get_properties_list_entry(device);
@@ -1406,7 +1420,7 @@ udev_drm_event(int fd, uint32_t mask, void *data)
event = udev_monitor_receive_device(ec->udev_monitor);
- if (udev_event_is_hotplug(event))
+ if (udev_event_is_hotplug(ec, event))
update_outputs(ec, event);
udev_device_unref(event);