mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	wrap container in direction (if possible)
Introduces container wrapping - if there is no other viable move, the selection wraps on the first container where such action is possible.
This commit is contained in:
		
							parent
							
								
									fa119661e9
								
							
						
					
					
						commit
						7f558ce894
					
				
					 1 changed files with 18 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -1084,13 +1084,17 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
 | 
			
		|||
		return container->fullscreen;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	swayc_t *wrap_candidate = NULL;
 | 
			
		||||
	while (true) {
 | 
			
		||||
		// Test if we can even make a difference here
 | 
			
		||||
		bool can_move = false;
 | 
			
		||||
		int diff = 0;
 | 
			
		||||
		if (parent->type == C_ROOT) {
 | 
			
		||||
			sway_log(L_DEBUG, "Moving between outputs");
 | 
			
		||||
			swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true);
 | 
			
		||||
			if (!output || output == container) {
 | 
			
		||||
				return wrap_candidate;
 | 
			
		||||
			}
 | 
			
		||||
			sway_log(L_DEBUG, "Moving between outputs");
 | 
			
		||||
			return get_swayc_in_output_direction(output, dir);
 | 
			
		||||
		} else {
 | 
			
		||||
			if (dir == MOVE_LEFT || dir == MOVE_RIGHT) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1108,8 +1112,18 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
 | 
			
		|||
 | 
			
		||||
		if (can_move) {
 | 
			
		||||
			int desired = index_child(container) + diff;
 | 
			
		||||
			if (container->is_floating || desired < 0 || desired >= parent->children->length) {
 | 
			
		||||
			if (container->is_floating) {
 | 
			
		||||
				can_move = false;
 | 
			
		||||
			} else if (desired < 0 || desired >= parent->children->length) {
 | 
			
		||||
				can_move = false;
 | 
			
		||||
				int len = parent->children->length;
 | 
			
		||||
				if (!wrap_candidate && len > 1) {
 | 
			
		||||
					if (desired < 0) {
 | 
			
		||||
						wrap_candidate = parent->children->items[len-1];
 | 
			
		||||
					} else {
 | 
			
		||||
						wrap_candidate = parent->children->items[0];
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				return parent->children->items[desired];
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -1118,8 +1132,8 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
 | 
			
		|||
			container = parent;
 | 
			
		||||
			parent = parent->parent;
 | 
			
		||||
			if (!parent || container == limit) {
 | 
			
		||||
				// Nothing we can do
 | 
			
		||||
				return NULL;
 | 
			
		||||
				// wrapping is the last chance
 | 
			
		||||
				return wrap_candidate;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue