|  |  |  | @ -25,21 +25,6 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include "log.h" | 
			
		
	
		
			
				
					|  |  |  |  | #include "stringop.h" | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static list_t *bfs_queue; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static list_t *get_bfs_queue() { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!bfs_queue) { | 
			
		
	
		
			
				
					|  |  |  |  | 		bfs_queue = create_list(); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (!bfs_queue) { | 
			
		
	
		
			
				
					|  |  |  |  | 			wlr_log(WLR_ERROR, "could not allocate list for bfs queue"); | 
			
		
	
		
			
				
					|  |  |  |  | 			return NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	bfs_queue->length = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return bfs_queue; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | const char *container_type_to_str(enum sway_container_type type) { | 
			
		
	
		
			
				
					|  |  |  |  | 	switch (type) { | 
			
		
	
		
			
				
					|  |  |  |  | 	case C_ROOT: | 
			
		
	
	
		
			
				
					|  |  |  | @ -450,7 +435,7 @@ struct sway_container *container_close(struct sway_container *con) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (con->type == C_VIEW) { | 
			
		
	
		
			
				
					|  |  |  |  | 		view_close(con->sway_view); | 
			
		
	
		
			
				
					|  |  |  |  | 	} else { | 
			
		
	
		
			
				
					|  |  |  |  | 		container_for_each_descendant_dfs(con, container_close_func, NULL); | 
			
		
	
		
			
				
					|  |  |  |  | 		container_for_each_descendant(con, container_close_func, NULL); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return parent; | 
			
		
	
	
		
			
				
					|  |  |  | @ -760,7 +745,7 @@ struct sway_container *container_at(struct sway_container *workspace, | 
			
		
	
		
			
				
					|  |  |  |  | 	return NULL; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void container_for_each_descendant_dfs(struct sway_container *container, | 
			
		
	
		
			
				
					|  |  |  |  | void container_for_each_descendant(struct sway_container *container, | 
			
		
	
		
			
				
					|  |  |  |  | 		void (*f)(struct sway_container *container, void *data), | 
			
		
	
		
			
				
					|  |  |  |  | 		void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!container) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -769,43 +754,19 @@ void container_for_each_descendant_dfs(struct sway_container *container, | 
			
		
	
		
			
				
					|  |  |  |  | 	if (container->children)  { | 
			
		
	
		
			
				
					|  |  |  |  | 		for (int i = 0; i < container->children->length; ++i) { | 
			
		
	
		
			
				
					|  |  |  |  | 			struct sway_container *child = container->children->items[i]; | 
			
		
	
		
			
				
					|  |  |  |  | 			container_for_each_descendant_dfs(child, f, data); | 
			
		
	
		
			
				
					|  |  |  |  | 			container_for_each_descendant(child, f, data); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	if (container->type == C_WORKSPACE)  { | 
			
		
	
		
			
				
					|  |  |  |  | 		struct sway_container *floating = container->sway_workspace->floating; | 
			
		
	
		
			
				
					|  |  |  |  | 		for (int i = 0; i < floating->children->length; ++i) { | 
			
		
	
		
			
				
					|  |  |  |  | 			struct sway_container *child = floating->children->items[i]; | 
			
		
	
		
			
				
					|  |  |  |  | 			container_for_each_descendant_dfs(child, f, data); | 
			
		
	
		
			
				
					|  |  |  |  | 			container_for_each_descendant(child, f, data); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	f(container, data); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void container_for_each_descendant_bfs(struct sway_container *con, | 
			
		
	
		
			
				
					|  |  |  |  | 		void (*f)(struct sway_container *con, void *data), void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	list_t *queue = get_bfs_queue(); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!queue) { | 
			
		
	
		
			
				
					|  |  |  |  | 		return; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (queue == NULL) { | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_log(WLR_ERROR, "could not allocate list"); | 
			
		
	
		
			
				
					|  |  |  |  | 		return; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	list_add(queue, con); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_container *current = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 	while (queue->length) { | 
			
		
	
		
			
				
					|  |  |  |  | 		current = queue->items[0]; | 
			
		
	
		
			
				
					|  |  |  |  | 		list_del(queue, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 		f(current, data); | 
			
		
	
		
			
				
					|  |  |  |  | 		// TODO floating containers
 | 
			
		
	
		
			
				
					|  |  |  |  | 		list_cat(queue, current->children); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | bool container_has_ancestor(struct sway_container *descendant, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct sway_container *ancestor) { | 
			
		
	
		
			
				
					|  |  |  |  | 	while (descendant->type != C_ROOT) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -1289,8 +1250,7 @@ void container_set_fullscreen(struct sway_container *container, bool enable) { | 
			
		
	
		
			
				
					|  |  |  |  | 		container_set_fullscreen(workspace->sway_workspace->fullscreen, false); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	container_for_each_descendant_dfs(container, | 
			
		
	
		
			
				
					|  |  |  |  | 			set_fullscreen_iterator, &enable); | 
			
		
	
		
			
				
					|  |  |  |  | 	container_for_each_descendant(container, set_fullscreen_iterator, &enable); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	container->is_fullscreen = enable; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |