mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Handle unmanaged surfaces motion
This commit is contained in:
		
							parent
							
								
									d65d001aa5
								
							
						
					
					
						commit
						641807d920
					
				
					 4 changed files with 31 additions and 20 deletions
				
			
		| 
						 | 
				
			
			@ -87,6 +87,8 @@ struct sway_xwayland_unmanaged {
 | 
			
		|||
	struct wlr_xwayland_surface *wlr_xwayland_surface;
 | 
			
		||||
	struct wl_list link;
 | 
			
		||||
 | 
			
		||||
	int lx, ly;
 | 
			
		||||
 | 
			
		||||
	struct wl_listener request_configure;
 | 
			
		||||
	struct wl_listener commit;
 | 
			
		||||
	struct wl_listener map;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -267,17 +267,14 @@ static void render_output(struct sway_output *output, struct timespec *when,
 | 
			
		|||
 | 
			
		||||
	// render unmanaged views on top
 | 
			
		||||
	struct wl_list *unmanaged = &root_container.sway_root->xwayland_unmanaged;
 | 
			
		||||
	struct sway_xwayland_unmanaged *sway_surface;
 | 
			
		||||
	wl_list_for_each(sway_surface, unmanaged, link) {
 | 
			
		||||
	struct sway_xwayland_unmanaged *unmanaged_surface;
 | 
			
		||||
	wl_list_for_each(unmanaged_surface, unmanaged, link) {
 | 
			
		||||
		struct wlr_xwayland_surface *xsurface =
 | 
			
		||||
			sway_surface->wlr_xwayland_surface;
 | 
			
		||||
		if (xsurface->surface == NULL) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
			unmanaged_surface->wlr_xwayland_surface;
 | 
			
		||||
 | 
			
		||||
		const struct wlr_box view_box = {
 | 
			
		||||
			.x = xsurface->x,
 | 
			
		||||
			.y = xsurface->y,
 | 
			
		||||
			.x = unmanaged_surface->lx,
 | 
			
		||||
			.y = unmanaged_surface->ly,
 | 
			
		||||
			.width = xsurface->width,
 | 
			
		||||
			.height = xsurface->height,
 | 
			
		||||
		};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,19 +29,35 @@ static void unmanaged_handle_commit(struct wl_listener *listener, void *data) {
 | 
			
		|||
	struct sway_xwayland_unmanaged *surface =
 | 
			
		||||
		wl_container_of(listener, surface, commit);
 | 
			
		||||
	struct wlr_xwayland_surface *xsurface = surface->wlr_xwayland_surface;
 | 
			
		||||
	desktop_damage_from_surface(xsurface->surface, xsurface->x, xsurface->y);
 | 
			
		||||
	// TODO: handle window motion
 | 
			
		||||
 | 
			
		||||
	if (xsurface->x != surface->lx || xsurface->y != surface->ly) {
 | 
			
		||||
		// Surface has moved
 | 
			
		||||
		desktop_damage_whole_surface(xsurface->surface,
 | 
			
		||||
			surface->lx, surface->ly);
 | 
			
		||||
		surface->lx = xsurface->x;
 | 
			
		||||
		surface->ly = xsurface->y;
 | 
			
		||||
		desktop_damage_whole_surface(xsurface->surface,
 | 
			
		||||
			surface->lx, surface->ly);
 | 
			
		||||
	} else {
 | 
			
		||||
		desktop_damage_from_surface(xsurface->surface,
 | 
			
		||||
			xsurface->x, xsurface->y);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void unmanaged_handle_map(struct wl_listener *listener, void *data) {
 | 
			
		||||
	struct sway_xwayland_unmanaged *surface =
 | 
			
		||||
		wl_container_of(listener, surface, map);
 | 
			
		||||
	struct wlr_xwayland_surface *xsurface = surface->wlr_xwayland_surface;
 | 
			
		||||
 | 
			
		||||
	wl_list_insert(&root_container.sway_root->xwayland_unmanaged,
 | 
			
		||||
		&surface->link);
 | 
			
		||||
 | 
			
		||||
	wl_signal_add(&xsurface->surface->events.commit, &surface->commit);
 | 
			
		||||
	surface->commit.notify = unmanaged_handle_commit;
 | 
			
		||||
	desktop_damage_whole_surface(xsurface->surface, xsurface->x, xsurface->y);
 | 
			
		||||
 | 
			
		||||
	surface->lx = xsurface->x;
 | 
			
		||||
	surface->ly = xsurface->y;
 | 
			
		||||
	desktop_damage_whole_surface(xsurface->surface, surface->lx, surface->ly);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void unmanaged_handle_unmap(struct wl_listener *listener, void *data) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,17 +48,13 @@ static struct sway_container *container_at_cursor(struct sway_cursor *cursor,
 | 
			
		|||
		struct wlr_surface **surface, double *sx, double *sy) {
 | 
			
		||||
	// check for unmanaged views first
 | 
			
		||||
	struct wl_list *unmanaged = &root_container.sway_root->xwayland_unmanaged;
 | 
			
		||||
	struct sway_xwayland_unmanaged *sway_surface;
 | 
			
		||||
	wl_list_for_each_reverse(sway_surface, unmanaged, link) {
 | 
			
		||||
	struct sway_xwayland_unmanaged *unmanaged_surface;
 | 
			
		||||
	wl_list_for_each_reverse(unmanaged_surface, unmanaged, link) {
 | 
			
		||||
		struct wlr_xwayland_surface *xsurface =
 | 
			
		||||
			sway_surface->wlr_xwayland_surface;
 | 
			
		||||
		if (xsurface->surface == NULL) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
			unmanaged_surface->wlr_xwayland_surface;
 | 
			
		||||
		struct wlr_box box = {
 | 
			
		||||
			.x = xsurface->x,
 | 
			
		||||
			.y = xsurface->y,
 | 
			
		||||
			.x = unmanaged_surface->lx,
 | 
			
		||||
			.y = unmanaged_surface->ly,
 | 
			
		||||
			.width = xsurface->width,
 | 
			
		||||
			.height = xsurface->height,
 | 
			
		||||
		};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue