mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Merge pull request #2449 from RyanDwyer/remove-bfs
Remove container_for_each_descendant_bfs
This commit is contained in:
		
						commit
						2aa6d98c5a
					
				
					 9 changed files with 15 additions and 62 deletions
				
			
		| 
						 | 
					@ -238,16 +238,10 @@ struct sway_container *tiling_container_at(
 | 
				
			||||||
		struct sway_container *con, double lx, double ly,
 | 
							struct sway_container *con, double lx, double ly,
 | 
				
			||||||
		struct wlr_surface **surface, double *sx, double *sy);
 | 
							struct wlr_surface **surface, double *sx, double *sy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Apply the function for each descendant of the container breadth first.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
void container_for_each_descendant_bfs(struct sway_container *container,
 | 
					 | 
				
			||||||
		void (*f)(struct sway_container *container, void *data), void *data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Apply the function for each child of the container depth first.
 | 
					 * Apply the function for each child of the container depth first.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
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);
 | 
							void (*f)(struct sway_container *container, void *data), void *data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ struct cmd_results *cmd_hide_edge_borders(int argc, char **argv) {
 | 
				
			||||||
				"<none|vertical|horizontal|both|smart>'");
 | 
									"<none|vertical|horizontal|both|smart>'");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container_for_each_descendant_dfs(&root_container, _configure_view, NULL);
 | 
						container_for_each_descendant(&root_container, _configure_view, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return cmd_results_new(CMD_SUCCESS, NULL, NULL);
 | 
						return cmd_results_new(CMD_SUCCESS, NULL, NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,7 @@ struct cmd_results *cmd_show_marks(int argc, char **argv) {
 | 
				
			||||||
	config->show_marks = parse_boolean(argv[0], config->show_marks);
 | 
						config->show_marks = parse_boolean(argv[0], config->show_marks);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (config->show_marks) {
 | 
						if (config->show_marks) {
 | 
				
			||||||
		container_for_each_descendant_dfs(&root_container,
 | 
							container_for_each_descendant(&root_container,
 | 
				
			||||||
				rebuild_marks_iterator, NULL);
 | 
									rebuild_marks_iterator, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,7 +52,7 @@ struct cmd_results *cmd_unmark(int argc, char **argv) {
 | 
				
			||||||
		view_find_and_unmark(mark);
 | 
							view_find_and_unmark(mark);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		// Remove all marks from all views
 | 
							// Remove all marks from all views
 | 
				
			||||||
		container_for_each_descendant_dfs(&root_container,
 | 
							container_for_each_descendant(&root_container,
 | 
				
			||||||
				remove_all_marks_iterator, NULL);
 | 
									remove_all_marks_iterator, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	free(mark);
 | 
						free(mark);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -822,7 +822,7 @@ void config_update_font_height(bool recalculate) {
 | 
				
			||||||
	size_t prev_max_height = config->font_height;
 | 
						size_t prev_max_height = config->font_height;
 | 
				
			||||||
	config->font_height = 0;
 | 
						config->font_height = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container_for_each_descendant_dfs(&root_container,
 | 
						container_for_each_descendant(&root_container,
 | 
				
			||||||
			find_font_height_iterator, &recalculate);
 | 
								find_font_height_iterator, &recalculate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Also consider floating views
 | 
						// Also consider floating views
 | 
				
			||||||
| 
						 | 
					@ -830,7 +830,7 @@ void config_update_font_height(bool recalculate) {
 | 
				
			||||||
		struct sway_container *output = root_container.children->items[i];
 | 
							struct sway_container *output = root_container.children->items[i];
 | 
				
			||||||
		for (int j = 0; j < output->children->length; ++j) {
 | 
							for (int j = 0; j < output->children->length; ++j) {
 | 
				
			||||||
			struct sway_container *ws = output->children->items[j];
 | 
								struct sway_container *ws = output->children->items[j];
 | 
				
			||||||
			container_for_each_descendant_dfs(ws->sway_workspace->floating,
 | 
								container_for_each_descendant(ws->sway_workspace->floating,
 | 
				
			||||||
					find_font_height_iterator, &recalculate);
 | 
										find_font_height_iterator, &recalculate);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,7 +167,7 @@ static bool criteria_matches_view(struct criteria *criteria,
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		list_t *urgent_views = create_list();
 | 
							list_t *urgent_views = create_list();
 | 
				
			||||||
		container_for_each_descendant_dfs(&root_container,
 | 
							container_for_each_descendant(&root_container,
 | 
				
			||||||
				find_urgent_iterator, urgent_views);
 | 
									find_urgent_iterator, urgent_views);
 | 
				
			||||||
		list_stable_sort(urgent_views, cmp_urgent);
 | 
							list_stable_sort(urgent_views, cmp_urgent);
 | 
				
			||||||
		struct sway_view *target;
 | 
							struct sway_view *target;
 | 
				
			||||||
| 
						 | 
					@ -228,7 +228,7 @@ list_t *criteria_get_views(struct criteria *criteria) {
 | 
				
			||||||
		.criteria = criteria,
 | 
							.criteria = criteria,
 | 
				
			||||||
		.matches = matches,
 | 
							.matches = matches,
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
	container_for_each_descendant_dfs(&root_container,
 | 
						container_for_each_descendant(&root_container,
 | 
				
			||||||
		criteria_get_views_iterator, &data);
 | 
							criteria_get_views_iterator, &data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Scratchpad items which are hidden are not in the tree.
 | 
						// Scratchpad items which are hidden are not in the tree.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -375,8 +375,7 @@ struct sway_seat *seat_create(struct sway_input_manager *input,
 | 
				
			||||||
	// init the focus stack
 | 
						// init the focus stack
 | 
				
			||||||
	wl_list_init(&seat->focus_stack);
 | 
						wl_list_init(&seat->focus_stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container_for_each_descendant_dfs(&root_container,
 | 
						container_for_each_descendant(&root_container, collect_focus_iter, seat);
 | 
				
			||||||
		collect_focus_iter, seat);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_signal_add(&root_container.sway_root->events.new_container,
 | 
						wl_signal_add(&root_container.sway_root->events.new_container,
 | 
				
			||||||
		&seat->new_container);
 | 
							&seat->new_container);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -631,7 +631,7 @@ void ipc_client_handle_command(struct ipc_client *client) {
 | 
				
			||||||
	case IPC_GET_WORKSPACES:
 | 
						case IPC_GET_WORKSPACES:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		json_object *workspaces = json_object_new_array();
 | 
							json_object *workspaces = json_object_new_array();
 | 
				
			||||||
		container_for_each_descendant_dfs(&root_container,
 | 
							container_for_each_descendant(&root_container,
 | 
				
			||||||
				ipc_get_workspaces_callback, workspaces);
 | 
									ipc_get_workspaces_callback, workspaces);
 | 
				
			||||||
		const char *json_string = json_object_to_json_string(workspaces);
 | 
							const char *json_string = json_object_to_json_string(workspaces);
 | 
				
			||||||
		client_valid =
 | 
							client_valid =
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,21 +25,6 @@
 | 
				
			||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
#include "stringop.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) {
 | 
					const char *container_type_to_str(enum sway_container_type type) {
 | 
				
			||||||
	switch (type) {
 | 
						switch (type) {
 | 
				
			||||||
	case C_ROOT:
 | 
						case C_ROOT:
 | 
				
			||||||
| 
						 | 
					@ -450,7 +435,7 @@ struct sway_container *container_close(struct sway_container *con) {
 | 
				
			||||||
	if (con->type == C_VIEW) {
 | 
						if (con->type == C_VIEW) {
 | 
				
			||||||
		view_close(con->sway_view);
 | 
							view_close(con->sway_view);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		container_for_each_descendant_dfs(con, container_close_func, NULL);
 | 
							container_for_each_descendant(con, container_close_func, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return parent;
 | 
						return parent;
 | 
				
			||||||
| 
						 | 
					@ -760,7 +745,7 @@ struct sway_container *container_at(struct sway_container *workspace,
 | 
				
			||||||
	return NULL;
 | 
						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 (*f)(struct sway_container *container, void *data),
 | 
				
			||||||
		void *data) {
 | 
							void *data) {
 | 
				
			||||||
	if (!container) {
 | 
						if (!container) {
 | 
				
			||||||
| 
						 | 
					@ -769,43 +754,19 @@ void container_for_each_descendant_dfs(struct sway_container *container,
 | 
				
			||||||
	if (container->children)  {
 | 
						if (container->children)  {
 | 
				
			||||||
		for (int i = 0; i < container->children->length; ++i) {
 | 
							for (int i = 0; i < container->children->length; ++i) {
 | 
				
			||||||
			struct sway_container *child = container->children->items[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)  {
 | 
						if (container->type == C_WORKSPACE)  {
 | 
				
			||||||
		struct sway_container *floating = container->sway_workspace->floating;
 | 
							struct sway_container *floating = container->sway_workspace->floating;
 | 
				
			||||||
		for (int i = 0; i < floating->children->length; ++i) {
 | 
							for (int i = 0; i < floating->children->length; ++i) {
 | 
				
			||||||
			struct sway_container *child = floating->children->items[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);
 | 
						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,
 | 
					bool container_has_ancestor(struct sway_container *descendant,
 | 
				
			||||||
		struct sway_container *ancestor) {
 | 
							struct sway_container *ancestor) {
 | 
				
			||||||
	while (descendant->type != C_ROOT) {
 | 
						while (descendant->type != C_ROOT) {
 | 
				
			||||||
| 
						 | 
					@ -1276,8 +1237,7 @@ void container_set_fullscreen(struct sway_container *container, bool enable) {
 | 
				
			||||||
		container_set_fullscreen(workspace->sway_workspace->fullscreen, false);
 | 
							container_set_fullscreen(workspace->sway_workspace->fullscreen, false);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container_for_each_descendant_dfs(container,
 | 
						container_for_each_descendant(container, set_fullscreen_iterator, &enable);
 | 
				
			||||||
			set_fullscreen_iterator, &enable);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container->is_fullscreen = enable;
 | 
						container->is_fullscreen = enable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue