mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	xwayland: guard against mapping view without surface
...which may occur if a user minimizes an xwayland view (typically a child view such as a dialog) at the same time as the client sends a request-unmap, which xwayland clients sometimes do without actually requesting destroy and just leave them dangling.
This commit is contained in:
		
							parent
							
								
									1212f34825
								
							
						
					
					
						commit
						dfc0dfba6d
					
				
					 1 changed files with 11 additions and 2 deletions
				
			
		| 
						 | 
					@ -410,14 +410,23 @@ top_left_edge_boundary_check(struct view *view)
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
xwayland_view_map(struct view *view)
 | 
					xwayland_view_map(struct view *view)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct wlr_xwayland_surface *xwayland_surface = xwayland_surface_from_view(view);
 | 
				
			||||||
	if (view->mapped) {
 | 
						if (view->mapped) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (!xwayland_surface->surface) {
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * We may get here if a user minimizes an xwayland dialog at the
 | 
				
			||||||
 | 
							 * same time as the client requests unmap, which xwayland
 | 
				
			||||||
 | 
							 * clients sometimes do without actually requesting destroy
 | 
				
			||||||
 | 
							 * even if they don't intend to use that view/surface anymore
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							wlr_log(WLR_DEBUG, "Cannot map view without wlr_surface");
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	view->mapped = true;
 | 
						view->mapped = true;
 | 
				
			||||||
	ensure_initial_geometry_and_output(view);
 | 
						ensure_initial_geometry_and_output(view);
 | 
				
			||||||
	wlr_scene_node_set_enabled(&view->scene_tree->node, true);
 | 
						wlr_scene_node_set_enabled(&view->scene_tree->node, true);
 | 
				
			||||||
	struct wlr_xwayland_surface *xwayland_surface =
 | 
					 | 
				
			||||||
		xwayland_surface_from_view(view);
 | 
					 | 
				
			||||||
	if (!view->fullscreen && xwayland_surface->fullscreen) {
 | 
						if (!view->fullscreen && xwayland_surface->fullscreen) {
 | 
				
			||||||
		view_set_fullscreen(view, true);
 | 
							view_set_fullscreen(view, true);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue