mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	compositor: drop wlr_surface.{sx,sy}
The concept of a persistent accumulated surface offset is wrong
from a protocol point-of-view. wl_surface.offset is tied to a
commit, its interpretation depends on the surface role.
For example, with the following sequence:
    wl_surface@1.offset(1, 1)
    wl_surface@1.commit()
    wl_pointer@2.set_cursor(wl_surface@1, 42, 42)
The final cursor hotspot is (42, 42): the commit which happened
before the set_cursor request has no impact on the hotspot
computation.
The wlr_output_cursor logic already uses wlr_surface.current.{dx,dy}.
wlr_scene's drag icon doesn't, update it accordingly.
			
			
This commit is contained in:
		
							parent
							
								
									a40ba16a64
								
							
						
					
					
						commit
						258bf9be1e
					
				
					 3 changed files with 3 additions and 10 deletions
				
			
		| 
						 | 
					@ -98,10 +98,6 @@ struct wlr_surface {
 | 
				
			||||||
	 * or something went wrong with uploading the buffer.
 | 
						 * or something went wrong with uploading the buffer.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	struct wlr_client_buffer *buffer;
 | 
						struct wlr_client_buffer *buffer;
 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * The buffer position, in surface-local units.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	int sx, sy;
 | 
					 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * The last commit's buffer damage, in buffer-local coordinates. This
 | 
						 * The last commit's buffer damage, in buffer-local coordinates. This
 | 
				
			||||||
	 * contains both the damage accumulated by the client via
 | 
						 * contains both the damage accumulated by the client via
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,8 +18,9 @@ static void drag_icon_handle_surface_commit(struct wl_listener *listener, void *
 | 
				
			||||||
	struct wlr_scene_drag_icon *icon =
 | 
						struct wlr_scene_drag_icon *icon =
 | 
				
			||||||
		wl_container_of(listener, icon, drag_icon_surface_commit);
 | 
							wl_container_of(listener, icon, drag_icon_surface_commit);
 | 
				
			||||||
	struct wlr_surface *surface = icon->drag_icon->surface;
 | 
						struct wlr_surface *surface = icon->drag_icon->surface;
 | 
				
			||||||
	wlr_scene_node_set_position(&icon->surface_tree->node,
 | 
						struct wlr_scene_node *node = &icon->surface_tree->node;
 | 
				
			||||||
		surface->sx, surface->sy);
 | 
						wlr_scene_node_set_position(node,
 | 
				
			||||||
 | 
							node->x + surface->current.dx, node->y + surface->current.dy);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drag_icon_handle_map(struct wl_listener *listener, void *data) {
 | 
					static void drag_icon_handle_map(struct wl_listener *listener, void *data) {
 | 
				
			||||||
| 
						 | 
					@ -74,8 +75,6 @@ struct wlr_scene_tree *wlr_scene_drag_icon_create(
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wlr_scene_node_set_position(&icon->surface_tree->node,
 | 
					 | 
				
			||||||
		drag_icon->surface->sx, drag_icon->surface->sy);
 | 
					 | 
				
			||||||
	wlr_scene_node_set_enabled(&icon->tree->node, drag_icon->mapped);
 | 
						wlr_scene_node_set_enabled(&icon->tree->node, drag_icon->mapped);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	icon->tree_destroy.notify = drag_icon_handle_tree_destroy;
 | 
						icon->tree_destroy.notify = drag_icon_handle_tree_destroy;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -439,8 +439,6 @@ static void surface_commit_state(struct wlr_surface *surface,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool invalid_buffer = next->committed & WLR_SURFACE_STATE_BUFFER;
 | 
						bool invalid_buffer = next->committed & WLR_SURFACE_STATE_BUFFER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	surface->sx += next->dx;
 | 
					 | 
				
			||||||
	surface->sy += next->dy;
 | 
					 | 
				
			||||||
	surface_update_damage(&surface->buffer_damage, &surface->current, next);
 | 
						surface_update_damage(&surface->buffer_damage, &surface->current, next);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pixman_region32_clear(&surface->external_damage);
 | 
						pixman_region32_clear(&surface->external_damage);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue