mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-10-29 05:40:12 -04:00 
			
		
		
		
	Added device matching
This commit is contained in:
		
							parent
							
								
									7efdd3c9fc
								
							
						
					
					
						commit
						f9d363fece
					
				
					 4 changed files with 39 additions and 8 deletions
				
			
		|  | @ -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 (dup2(*new_fd, drm->fd) < 0) { | ||||
| 	if (arg->dev != drm->dev) { | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	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, | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ | |||
| 
 | ||||
| struct wlr_backend_state { | ||||
| 	int fd; | ||||
| 	dev_t dev; | ||||
| 
 | ||||
| 	struct wlr_backend *backend; | ||||
| 	struct wl_event_source *drm_event; | ||||
|  |  | |||
|  | @ -2,9 +2,16 @@ | |||
| #define WLR_SESSION_H | ||||
| 
 | ||||
| #include <wayland-server.h> | ||||
| #include <sys/types.h> | ||||
| 
 | ||||
| struct session_interface; | ||||
| 
 | ||||
| // Passed to the listeners of device_paused/resumed
 | ||||
| struct device_arg { | ||||
| 	dev_t dev; | ||||
| 	int fd; // Only for device_resumed
 | ||||
| }; | ||||
| 
 | ||||
| struct wlr_session { | ||||
| 	const struct session_interface *iface; | ||||
| 
 | ||||
|  |  | |||
|  | @ -198,8 +198,12 @@ static int pause_device(sd_bus_message *msg, void *userdata, sd_bus_error *ret_e | |||
| 		goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	dev_t dev = makedev(major, minor); | ||||
| 	wl_signal_emit(&session->base.device_paused, &dev); | ||||
| 	struct device_arg arg = { | ||||
| 		.dev = makedev(major, minor), | ||||
| 		.fd = -1, | ||||
| 	}; | ||||
| 
 | ||||
| 	wl_signal_emit(&session->base.device_paused, &arg); | ||||
| 
 | ||||
| 	ret = sd_bus_call_method(session->bus, "org.freedesktop.login1", | ||||
| 		session->path, "org.freedesktop.login1.Session", "PauseDeviceComplete", | ||||
|  | @ -226,9 +230,12 @@ static int resume_device(sd_bus_message *msg, void *userdata, sd_bus_error *ret_ | |||
| 		goto error; | ||||
| 	} | ||||
| 
 | ||||
| 	// TODO: Use major/minor to make sure the right devices are getting signals
 | ||||
| 	struct device_arg arg = { | ||||
| 		.dev = makedev(major, minor), | ||||
| 		.fd = fd, | ||||
| 	}; | ||||
| 
 | ||||
| 	wl_signal_emit(&session->base.device_resumed, &fd); | ||||
| 	wl_signal_emit(&session->base.device_resumed, &arg); | ||||
| 
 | ||||
| error: | ||||
| 	return 0; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Scott Anderson
						Scott Anderson