diff options
author | Scott Anderson <ascent12@hotmail.com> | 2017-05-14 13:07:34 +1200 |
---|---|---|
committer | Scott Anderson <ascent12@hotmail.com> | 2017-05-14 13:07:34 +1200 |
commit | f9d363fece0046cabfa00ad6b72b50f45b70db60 (patch) | |
tree | 5387efd85f29f1acdb8908cf3a479192c50846db /backend/drm | |
parent | 7efdd3c9fc38de377a43bb368cf113524b5a73d7 (diff) |
Added device matching
Diffstat (limited to 'backend/drm')
-rw-r--r-- | backend/drm/backend.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/backend/drm/backend.c b/backend/drm/backend.c index e49197ec..d8b7fc0e 100644 --- a/backend/drm/backend.c +++ b/backend/drm/backend.c @@ -4,6 +4,7 @@ #include <string.h> #include <errno.h> #include <wayland-server.h> +#include <sys/stat.h> #include <wlr/session.h> #include <wlr/common/list.h> @@ -38,23 +39,32 @@ static struct wlr_backend_impl backend_impl = { }; static void device_paused(struct wl_listener *listener, void *data) { - struct wlr_backend_state *backend = wl_container_of(listener, backend, device_paused); + struct wlr_backend_state *drm = wl_container_of(listener, drm, device_paused); + struct device_arg *arg = data; // TODO: Actually pause the renderer or something. // We currently just expect it to fail its next pageflip. - (void)backend; + if (arg->dev == drm->dev) { + wlr_log(L_INFO, "DRM fd paused"); + } } static void device_resumed(struct wl_listener *listener, void *data) { struct wlr_backend_state *drm = wl_container_of(listener, drm, device_resumed); - int *new_fd = data; + struct device_arg *arg = data; + + if (arg->dev != drm->dev) { + return; + } - if (dup2(*new_fd, drm->fd) < 0) { + if (dup2(arg->fd, drm->fd) < 0) { wlr_log(L_ERROR, "dup2 failed: %s", strerror(errno)); return; } + wlr_log(L_INFO, "DRM fd resumed"); + for (size_t i = 0; i < drm->outputs->length; ++i) { struct wlr_output_state *output = drm->outputs->items[i]; wlr_drm_output_start_renderer(output); @@ -94,6 +104,12 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display, goto error_udev; } + struct stat st; + if (fstat(state->fd, &st) < 0) { + wlr_log(L_ERROR, "Stat failed: %s", strerror(errno)); + } + state->dev = st.st_rdev; + struct wl_event_loop *event_loop = wl_display_get_event_loop(display); state->drm_event = wl_event_loop_add_fd(event_loop, state->fd, |