mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Fix moving into right end of container
This commit is contained in:
		
							parent
							
								
									cd6e3182fa
								
							
						
					
					
						commit
						1f70b94f34
					
				
					 1 changed files with 16 additions and 10 deletions
				
			
		| 
						 | 
					@ -107,6 +107,7 @@ void container_insert_child(struct sway_container *parent,
 | 
				
			||||||
	if (old_parent) {
 | 
						if (old_parent) {
 | 
				
			||||||
		container_remove_child(child);
 | 
							container_remove_child(child);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						wlr_log(L_DEBUG, "Inserting id:%zd at index %d", child->id, i);
 | 
				
			||||||
	list_insert(parent->children, i, child);
 | 
						list_insert(parent->children, i, child);
 | 
				
			||||||
	child->parent = parent;
 | 
						child->parent = parent;
 | 
				
			||||||
	wl_signal_emit(&child->events.reparent, old_parent);
 | 
						wl_signal_emit(&child->events.reparent, old_parent);
 | 
				
			||||||
| 
						 | 
					@ -229,23 +230,24 @@ static enum movement_direction invert_movement(enum movement_direction dir) {
 | 
				
			||||||
	case MOVE_UP:
 | 
						case MOVE_UP:
 | 
				
			||||||
		return MOVE_DOWN;
 | 
							return MOVE_DOWN;
 | 
				
			||||||
	case MOVE_DOWN:
 | 
						case MOVE_DOWN:
 | 
				
			||||||
		return MOVE_LEFT;
 | 
							return MOVE_UP;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		sway_assert(0, "This function expects left|right|up|down");
 | 
							sway_assert(0, "This function expects left|right|up|down");
 | 
				
			||||||
		return MOVE_LEFT;
 | 
							return MOVE_LEFT;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int move_offs(enum movement_direction move_dir) {
 | 
				
			||||||
 | 
						return move_dir == MOVE_LEFT || move_dir == MOVE_UP ? -1 : 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Gets the index of the most extreme member based on the movement offset */
 | 
					/* Gets the index of the most extreme member based on the movement offset */
 | 
				
			||||||
static int container_limit(struct sway_container *container, int offs) {
 | 
					static int container_limit(struct sway_container *container,
 | 
				
			||||||
 | 
							enum movement_direction move_dir) {
 | 
				
			||||||
	if (container->children->length == 0) {
 | 
						if (container->children->length == 0) {
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return offs < 0 ? 0 : container->children->length - 1;
 | 
						return move_offs(move_dir) < 0 ? 0 : container->children->length - 1;
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int move_offs(enum movement_direction move_dir) {
 | 
					 | 
				
			||||||
	return move_dir == MOVE_LEFT || move_dir == MOVE_UP ? -1 : 1;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void workspace_rejigger(struct sway_container *ws,
 | 
					static void workspace_rejigger(struct sway_container *ws,
 | 
				
			||||||
| 
						 | 
					@ -301,7 +303,7 @@ void container_move(struct sway_container *container,
 | 
				
			||||||
				container_type_to_str(current->type), current->name);
 | 
									container_type_to_str(current->type), current->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		int index = index_child(current);
 | 
							int index = index_child(current);
 | 
				
			||||||
		int limit = container_limit(parent, offs);
 | 
							int limit = container_limit(parent, move_dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch (current->type) {
 | 
							switch (current->type) {
 | 
				
			||||||
		case C_OUTPUT: {
 | 
							case C_OUTPUT: {
 | 
				
			||||||
| 
						 | 
					@ -402,9 +404,11 @@ void container_move(struct sway_container *container,
 | 
				
			||||||
		case C_WORKSPACE: // Note: only in the case of moving between outputs
 | 
							case C_WORKSPACE: // Note: only in the case of moving between outputs
 | 
				
			||||||
		case C_CONTAINER:
 | 
							case C_CONTAINER:
 | 
				
			||||||
			if (is_parallel(sibling->layout, move_dir)) {
 | 
								if (is_parallel(sibling->layout, move_dir)) {
 | 
				
			||||||
				int limit = container_limit(sibling, move_dir);
 | 
									int limit = container_limit(sibling, invert_movement(move_dir));
 | 
				
			||||||
				wlr_log(L_DEBUG, "Reparenting container (paralell)");
 | 
					 | 
				
			||||||
				limit = limit != 0 ? limit + 1 : limit; // Convert to index
 | 
									limit = limit != 0 ? limit + 1 : limit; // Convert to index
 | 
				
			||||||
 | 
									wlr_log(L_DEBUG,
 | 
				
			||||||
 | 
											"Reparenting container (parallel) to index %d "
 | 
				
			||||||
 | 
											"(move dir: %d)", limit, move_dir);
 | 
				
			||||||
				container_insert_child(sibling, container, limit);
 | 
									container_insert_child(sibling, container, limit);
 | 
				
			||||||
				container->width = container->height = 0;
 | 
									container->width = container->height = 0;
 | 
				
			||||||
				arrange_windows(sibling, -1, -1);
 | 
									arrange_windows(sibling, -1, -1);
 | 
				
			||||||
| 
						 | 
					@ -421,8 +425,10 @@ void container_move(struct sway_container *container,
 | 
				
			||||||
					sibling = focus_inactive;
 | 
										sibling = focus_inactive;
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				} else if (sibling->children->length) {
 | 
									} else if (sibling->children->length) {
 | 
				
			||||||
 | 
										wlr_log(L_DEBUG, "No focus-inactive, adding arbitrarily");
 | 
				
			||||||
					container_add_sibling(sibling->children->items[0], container);
 | 
										container_add_sibling(sibling->children->items[0], container);
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
 | 
										wlr_log(L_DEBUG, "No kiddos, adding container alone");
 | 
				
			||||||
					container_add_child(sibling, container);
 | 
										container_add_child(sibling, container);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				container->width = container->height = 0;
 | 
									container->width = container->height = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue