mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	fix some segfaults
This commit is contained in:
		
							parent
							
								
									2aec85bf24
								
							
						
					
					
						commit
						eda425fdab
					
				
					 3 changed files with 19 additions and 11 deletions
				
			
		| 
						 | 
					@ -94,6 +94,7 @@ static void handle_seat_container_destroy(struct wl_listener *listener,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO handle workspace switch in the seat?
 | 
						// TODO handle workspace switch in the seat?
 | 
				
			||||||
	bool set_focus =
 | 
						bool set_focus =
 | 
				
			||||||
 | 
							focus != NULL &&
 | 
				
			||||||
		(focus == con || container_has_child(con, focus)) &&
 | 
							(focus == con || container_has_child(con, focus)) &&
 | 
				
			||||||
		con->type != C_WORKSPACE;
 | 
							con->type != C_WORKSPACE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,12 +104,13 @@ static void handle_seat_container_destroy(struct wl_listener *listener,
 | 
				
			||||||
		struct sway_container *next_focus = NULL;
 | 
							struct sway_container *next_focus = NULL;
 | 
				
			||||||
		while (next_focus == NULL) {
 | 
							while (next_focus == NULL) {
 | 
				
			||||||
			next_focus = sway_seat_get_focus_by_type(seat, parent, C_VIEW);
 | 
								next_focus = sway_seat_get_focus_by_type(seat, parent, C_VIEW);
 | 
				
			||||||
			parent = parent->parent;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (next_focus == NULL && parent->type == C_WORKSPACE) {
 | 
								if (next_focus == NULL && parent->type == C_WORKSPACE) {
 | 
				
			||||||
				next_focus = parent;
 | 
									next_focus = parent;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								parent = parent->parent;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// the structure change might have caused it to move up to the top of
 | 
							// the structure change might have caused it to move up to the top of
 | 
				
			||||||
| 
						 | 
					@ -440,7 +442,8 @@ struct sway_container *sway_seat_get_focus_by_type(struct sway_seat *seat,
 | 
				
			||||||
	wl_list_for_each(current, &seat->focus_stack, link) {
 | 
						wl_list_for_each(current, &seat->focus_stack, link) {
 | 
				
			||||||
		parent = current->container->parent;
 | 
							parent = current->container->parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (current->container == container) {
 | 
							if (current->container == container &&
 | 
				
			||||||
 | 
									(type == C_TYPES || container->type == type)) {
 | 
				
			||||||
			return current->container;
 | 
								return current->container;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,11 +69,11 @@ static struct sway_container *_container_destroy(struct sway_container *cont) {
 | 
				
			||||||
	if (cont->children != NULL) {
 | 
						if (cont->children != NULL) {
 | 
				
			||||||
		// remove children until there are no more, container_destroy calls
 | 
							// remove children until there are no more, container_destroy calls
 | 
				
			||||||
		// container_remove_child, which removes child from this container
 | 
							// container_remove_child, which removes child from this container
 | 
				
			||||||
		while (cont->children->length != 0) {
 | 
							while (cont->children != NULL && cont->children->length != 0) {
 | 
				
			||||||
			container_destroy(cont->children->items[0]);
 | 
								struct sway_container *child = cont->children->items[0];
 | 
				
			||||||
 | 
								container_remove_child(child);
 | 
				
			||||||
 | 
								container_destroy(child);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		list_free(cont->children);
 | 
					 | 
				
			||||||
		cont->children = NULL;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (cont->marks) {
 | 
						if (cont->marks) {
 | 
				
			||||||
		list_foreach(cont->marks, free);
 | 
							list_foreach(cont->marks, free);
 | 
				
			||||||
| 
						 | 
					@ -85,13 +85,17 @@ static struct sway_container *_container_destroy(struct sway_container *cont) {
 | 
				
			||||||
	if (cont->name) {
 | 
						if (cont->name) {
 | 
				
			||||||
		free(cont->name);
 | 
							free(cont->name);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						list_free(cont->children);
 | 
				
			||||||
 | 
						cont->children = NULL;
 | 
				
			||||||
	free(cont);
 | 
						free(cont);
 | 
				
			||||||
	return parent;
 | 
						return parent;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_container *container_destroy(struct sway_container *cont) {
 | 
					struct sway_container *container_destroy(struct sway_container *cont) {
 | 
				
			||||||
	cont = _container_destroy(cont);
 | 
						struct sway_container *parent = _container_destroy(cont);
 | 
				
			||||||
	return container_reap_empty(cont->parent);
 | 
						parent = container_reap_empty(parent);
 | 
				
			||||||
 | 
						arrange_windows(&root_container, -1, -1);
 | 
				
			||||||
 | 
						return parent;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_container *container_output_create(
 | 
					struct sway_container *container_output_create(
 | 
				
			||||||
| 
						 | 
					@ -409,7 +413,8 @@ bool find_child_func(struct sway_container *con, void *data) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool container_has_child(struct sway_container *con,
 | 
					bool container_has_child(struct sway_container *con,
 | 
				
			||||||
		struct sway_container *child) {
 | 
							struct sway_container *child) {
 | 
				
			||||||
	if (child->type == C_VIEW || child->children->length == 0) {
 | 
						if (child == NULL || child->type == C_VIEW ||
 | 
				
			||||||
 | 
								child->children->length == 0) {
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return container_find(con, find_child_func, child);
 | 
						return container_find(con, find_child_func, child);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,11 +106,11 @@ void container_add_child(struct sway_container *parent,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_container *container_reap_empty(struct sway_container *container) {
 | 
					struct sway_container *container_reap_empty(struct sway_container *container) {
 | 
				
			||||||
	if (!sway_assert(container, "reaping null container")) {
 | 
						if (container == NULL) {
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	wlr_log(L_DEBUG, "reaping %p %s", container, container->name);
 | 
						wlr_log(L_DEBUG, "reaping %p %s", container, container->name);
 | 
				
			||||||
	while (container != &root_container && container->children->length == 0) {
 | 
						while (container->type != C_VIEW && container != &root_container && container->children->length == 0) {
 | 
				
			||||||
		if (container->type == C_WORKSPACE) {
 | 
							if (container->type == C_WORKSPACE) {
 | 
				
			||||||
			if (!workspace_is_visible(container)) {
 | 
								if (!workspace_is_visible(container)) {
 | 
				
			||||||
				struct sway_container *parent = container->parent;
 | 
									struct sway_container *parent = container->parent;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue