|  |  |  | @ -86,6 +86,31 @@ static void seat_send_focus(struct sway_seat *seat, | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static struct sway_container *seat_get_focus_by_type(struct sway_seat *seat, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct sway_container *container, enum sway_container_type type) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (container->type == C_VIEW || container->children->length == 0) { | 
			
		
	
		
			
				
					|  |  |  |  | 		return container; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_seat_container *current = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_list_for_each(current, &seat->focus_stack, link) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (current->container->type != type && type != C_TYPES) { | 
			
		
	
		
			
				
					|  |  |  |  | 			continue; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (container_has_child(container, current->container)) { | 
			
		
	
		
			
				
					|  |  |  |  | 			return current->container; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return NULL; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct sway_container *container) { | 
			
		
	
		
			
				
					|  |  |  |  | 	return seat_get_focus_by_type(seat, container, C_VIEW); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_seat_container_destroy(struct wl_listener *listener, | 
			
		
	
		
			
				
					|  |  |  |  | 		void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_seat_container *seat_con = | 
			
		
	
	
		
			
				
					|  |  |  | @ -549,26 +574,6 @@ struct sway_container *sway_seat_get_focus(struct sway_seat *seat) { | 
			
		
	
		
			
				
					|  |  |  |  | 	return seat_get_focus_inactive(seat, &root_container); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | struct sway_container *seat_get_focus_by_type(struct sway_seat *seat, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct sway_container *container, enum sway_container_type type) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (container->type == C_VIEW || container->children->length == 0) { | 
			
		
	
		
			
				
					|  |  |  |  | 		return container; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_seat_container *current = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_list_for_each(current, &seat->focus_stack, link) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (current->container->type != type && type != C_TYPES) { | 
			
		
	
		
			
				
					|  |  |  |  | 			continue; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (container_has_child(container, current->container)) { | 
			
		
	
		
			
				
					|  |  |  |  | 			return current->container; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return NULL; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | struct sway_container *seat_get_focus(struct sway_seat *seat) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!seat->has_focus) { | 
			
		
	
		
			
				
					|  |  |  |  | 		return NULL; | 
			
		
	
	
		
			
				
					|  |  |  | 
 |