mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	input/cursor: handle setting a NULL image surface
This fixes a crash when attempting to listen to a signal on a NULL cursor image surface. If the surface is NULL, the listener is just reinitialized using wl_list_init.
This commit is contained in:
		
							parent
							
								
									897c36b12c
								
							
						
					
					
						commit
						1e2a2b0778
					
				
					 1 changed files with 13 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -798,6 +798,17 @@ static void handle_image_surface_destroy(struct wl_listener *listener,
 | 
			
		|||
	cursor_rebase(cursor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void set_image_surface(struct sway_cursor *cursor,
 | 
			
		||||
		struct wlr_surface *surface) {
 | 
			
		||||
	wl_list_remove(&cursor->image_surface_destroy.link);
 | 
			
		||||
	cursor->image_surface = surface;
 | 
			
		||||
	if (surface) {
 | 
			
		||||
		wl_signal_add(&surface->events.destroy, &cursor->image_surface_destroy);
 | 
			
		||||
	} else {
 | 
			
		||||
		wl_list_init(&cursor->image_surface_destroy.link);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cursor_set_image(struct sway_cursor *cursor, const char *image,
 | 
			
		||||
		struct wl_client *client) {
 | 
			
		||||
	if (!(cursor->seat->wlr_seat->capabilities & WL_SEAT_CAPABILITY_POINTER)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -805,10 +816,8 @@ void cursor_set_image(struct sway_cursor *cursor, const char *image,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	const char *current_image = cursor->image;
 | 
			
		||||
	set_image_surface(cursor, NULL);
 | 
			
		||||
	cursor->image = image;
 | 
			
		||||
	wl_list_remove(&cursor->image_surface_destroy.link);
 | 
			
		||||
	cursor->image_surface = NULL;
 | 
			
		||||
	wl_list_init(&cursor->image_surface_destroy.link);
 | 
			
		||||
	cursor->hotspot_x = cursor->hotspot_y = 0;
 | 
			
		||||
	cursor->image_client = client;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -831,11 +840,8 @@ void cursor_set_image_surface(struct sway_cursor *cursor,
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	set_image_surface(cursor, surface);
 | 
			
		||||
	cursor->image = NULL;
 | 
			
		||||
	wl_list_remove(&cursor->image_surface_destroy.link);
 | 
			
		||||
	cursor->image_surface = surface;
 | 
			
		||||
	wl_signal_add(&cursor->image_surface->events.destroy,
 | 
			
		||||
			&cursor->image_surface_destroy);
 | 
			
		||||
	cursor->hotspot_x = hotspot_x;
 | 
			
		||||
	cursor->hotspot_y = hotspot_y;
 | 
			
		||||
	cursor->image_client = client;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue