mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	cursor.c: use subsurface as reference for out-of-surface movement
The protocol states that the wl_pointer motion coordinates must be relative to the focused surface (e.g. the surface that last received a wl_pointer enter event). Before this patch, the coordinates were relative to the toplevel surface instead, resulting in subsurface events having the wrong coordinates when pressing a button over a subsurface and moving the cursor outside of that subsurface. Fixes: #2542
This commit is contained in:
		
							parent
							
								
									26064fb8f6
								
							
						
					
					
						commit
						37d745b01d
					
				
					 1 changed files with 10 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -455,9 +455,18 @@ process_cursor_motion_out_of_surface(struct server *server,
 | 
			
		|||
	assert(surface);
 | 
			
		||||
	int lx, ly;
 | 
			
		||||
 | 
			
		||||
	if (view) {
 | 
			
		||||
	if (node && wlr_subsurface_try_from_wlr_surface(surface)) {
 | 
			
		||||
		wlr_scene_node_coords(node, &lx, &ly);
 | 
			
		||||
	} else if (view) {
 | 
			
		||||
		lx = view->current.x;
 | 
			
		||||
		ly = view->current.y;
 | 
			
		||||
		/* Take into account invisible xdg-shell CSD borders */
 | 
			
		||||
		if (view->type == LAB_XDG_SHELL_VIEW) {
 | 
			
		||||
			struct wlr_box geo;
 | 
			
		||||
			wlr_xdg_surface_get_geometry(xdg_surface_from_view(view), &geo);
 | 
			
		||||
			lx -= geo.x;
 | 
			
		||||
			ly -= geo.y;
 | 
			
		||||
		}
 | 
			
		||||
	} else if (node && wlr_layer_surface_v1_try_from_wlr_surface(surface)) {
 | 
			
		||||
		wlr_scene_node_coords(node, &lx, &ly);
 | 
			
		||||
#if HAVE_XWAYLAND
 | 
			
		||||
| 
						 | 
				
			
			@ -471,13 +480,6 @@ process_cursor_motion_out_of_surface(struct server *server,
 | 
			
		|||
 | 
			
		||||
	*sx = server->seat.cursor->x - lx;
 | 
			
		||||
	*sy = server->seat.cursor->y - ly;
 | 
			
		||||
	/* Take into account invisible xdg-shell CSD borders */
 | 
			
		||||
	if (view && view->type == LAB_XDG_SHELL_VIEW) {
 | 
			
		||||
		struct wlr_box geo;
 | 
			
		||||
		wlr_xdg_surface_get_geometry(xdg_surface_from_view(view), &geo);
 | 
			
		||||
		*sx += geo.x;
 | 
			
		||||
		*sy += geo.y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue