mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	backend/drm: support updating cursor when session is paused
This commit is contained in:
		
							parent
							
								
									5aa642485d
								
							
						
					
					
						commit
						bb4aeb3b2f
					
				
					 3 changed files with 18 additions and 9 deletions
				
			
		| 
						 | 
					@ -91,6 +91,8 @@ static void session_signal(struct wl_listener *listener, void *data) {
 | 
				
			||||||
			struct wlr_drm_plane *plane = conn->crtc->cursor;
 | 
								struct wlr_drm_plane *plane = conn->crtc->cursor;
 | 
				
			||||||
			drm->iface->crtc_set_cursor(drm, conn->crtc,
 | 
								drm->iface->crtc_set_cursor(drm, conn->crtc,
 | 
				
			||||||
				(plane && plane->cursor_enabled) ? plane->cursor_bo : NULL);
 | 
									(plane && plane->cursor_enabled) ? plane->cursor_bo : NULL);
 | 
				
			||||||
 | 
								drm->iface->crtc_move_cursor(drm, conn->crtc, conn->cursor_x,
 | 
				
			||||||
 | 
									conn->cursor_y);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		wlr_log(L_INFO, "DRM fd paused");
 | 
							wlr_log(L_INFO, "DRM fd paused");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -517,10 +517,6 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
 | 
				
			||||||
	struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
 | 
						struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
 | 
				
			||||||
	struct wlr_drm_renderer *renderer = &drm->renderer;
 | 
						struct wlr_drm_renderer *renderer = &drm->renderer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!drm->session->active) {
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct wlr_drm_crtc *crtc = conn->crtc;
 | 
						struct wlr_drm_crtc *crtc = conn->crtc;
 | 
				
			||||||
	if (!crtc) {
 | 
						if (!crtc) {
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
| 
						 | 
					@ -540,6 +536,9 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
 | 
				
			||||||
	if (!buf && update_pixels) {
 | 
						if (!buf && update_pixels) {
 | 
				
			||||||
		// Hide the cursor
 | 
							// Hide the cursor
 | 
				
			||||||
		plane->cursor_enabled = false;
 | 
							plane->cursor_enabled = false;
 | 
				
			||||||
 | 
							if (!drm->session->active) {
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return drm->iface->crtc_set_cursor(drm, crtc, NULL);
 | 
							return drm->iface->crtc_set_cursor(drm, crtc, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	plane->cursor_enabled = true;
 | 
						plane->cursor_enabled = true;
 | 
				
			||||||
| 
						 | 
					@ -637,6 +636,10 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gbm_bo_unmap(bo, bo_data);
 | 
						gbm_bo_unmap(bo, bo_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!drm->session->active) {
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool ok = drm->iface->crtc_set_cursor(drm, crtc, bo);
 | 
						bool ok = drm->iface->crtc_set_cursor(drm, crtc, bo);
 | 
				
			||||||
	if (ok) {
 | 
						if (ok) {
 | 
				
			||||||
		wlr_output_update_needs_swap(output);
 | 
							wlr_output_update_needs_swap(output);
 | 
				
			||||||
| 
						 | 
					@ -648,9 +651,6 @@ static bool wlr_drm_connector_move_cursor(struct wlr_output *output,
 | 
				
			||||||
		int x, int y) {
 | 
							int x, int y) {
 | 
				
			||||||
	struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
 | 
						struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
 | 
				
			||||||
	struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
 | 
						struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
 | 
				
			||||||
	if (!drm->session->active) {
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (!conn->crtc) {
 | 
						if (!conn->crtc) {
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -670,6 +670,13 @@ static bool wlr_drm_connector_move_cursor(struct wlr_output *output,
 | 
				
			||||||
		box.y -= plane->cursor_hotspot_y;
 | 
							box.y -= plane->cursor_hotspot_y;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						conn->cursor_x = box.x;
 | 
				
			||||||
 | 
						conn->cursor_y = box.y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!drm->session->active) {
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool ok = drm->iface->crtc_move_cursor(drm, conn->crtc, box.x, box.y);
 | 
						bool ok = drm->iface->crtc_move_cursor(drm, conn->crtc, box.x, box.y);
 | 
				
			||||||
	if (ok) {
 | 
						if (ok) {
 | 
				
			||||||
		wlr_output_update_needs_swap(output);
 | 
							wlr_output_update_needs_swap(output);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,8 +123,8 @@ struct wlr_drm_connector {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	union wlr_drm_connector_props props;
 | 
						union wlr_drm_connector_props props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint32_t width;
 | 
						uint32_t width, height;
 | 
				
			||||||
	uint32_t height;
 | 
						int32_t cursor_x, cursor_y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drmModeCrtc *old_crtc;
 | 
						drmModeCrtc *old_crtc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue