mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Merge pull request #211 from sce/fix_get_swayc_in_direction
layout: get_swayc_in_direction: Properly find adjacent outputs.
This commit is contained in:
		
						commit
						ad1cd0a3bd
					
				
					 1 changed files with 2 additions and 53 deletions
				
			
		| 
						 | 
					@ -8,6 +8,7 @@
 | 
				
			||||||
#include "container.h"
 | 
					#include "container.h"
 | 
				
			||||||
#include "workspace.h"
 | 
					#include "workspace.h"
 | 
				
			||||||
#include "focus.h"
 | 
					#include "focus.h"
 | 
				
			||||||
 | 
					#include "output.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
swayc_t root_container;
 | 
					swayc_t root_container;
 | 
				
			||||||
list_t *scratchpad;
 | 
					list_t *scratchpad;
 | 
				
			||||||
| 
						 | 
					@ -480,7 +481,6 @@ void arrange_windows(swayc_t *container, double width, double height) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_direction dir, swayc_t *limit) {
 | 
					swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_direction dir, swayc_t *limit) {
 | 
				
			||||||
	swayc_t *parent = container->parent;
 | 
						swayc_t *parent = container->parent;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (dir == MOVE_PARENT) {
 | 
						if (dir == MOVE_PARENT) {
 | 
				
			||||||
		if (parent->type == C_OUTPUT) {
 | 
							if (parent->type == C_OUTPUT) {
 | 
				
			||||||
			return NULL;
 | 
								return NULL;
 | 
				
			||||||
| 
						 | 
					@ -492,60 +492,9 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
 | 
				
			||||||
		// Test if we can even make a difference here
 | 
							// Test if we can even make a difference here
 | 
				
			||||||
		bool can_move = false;
 | 
							bool can_move = false;
 | 
				
			||||||
		int diff = 0;
 | 
							int diff = 0;
 | 
				
			||||||
		int i;
 | 
					 | 
				
			||||||
		if (parent->type == C_ROOT) {
 | 
							if (parent->type == C_ROOT) {
 | 
				
			||||||
			// Find the next output
 | 
					 | 
				
			||||||
			int target = -1, max_x = 0, max_y = 0, self = -1;
 | 
					 | 
				
			||||||
			sway_log(L_DEBUG, "Moving between outputs");
 | 
								sway_log(L_DEBUG, "Moving between outputs");
 | 
				
			||||||
			
 | 
								return swayc_adjacent_output(container, dir);
 | 
				
			||||||
			for (i = 0; i < parent->children->length; ++i) {
 | 
					 | 
				
			||||||
				swayc_t *next = parent->children->items[i];
 | 
					 | 
				
			||||||
				if (next == container) {
 | 
					 | 
				
			||||||
					self = i;
 | 
					 | 
				
			||||||
					sway_log(L_DEBUG, "self is %p %d", next, self);
 | 
					 | 
				
			||||||
					continue;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if (next->type == C_OUTPUT) {
 | 
					 | 
				
			||||||
					sway_log(L_DEBUG, "Testing with %p %d (dir %d)", next, i, dir);
 | 
					 | 
				
			||||||
					// Check if it's more extreme
 | 
					 | 
				
			||||||
					if (dir == MOVE_RIGHT) {
 | 
					 | 
				
			||||||
						if (container->x + container->width <= next->x) {
 | 
					 | 
				
			||||||
							if (target == -1 || next->x < max_x) {
 | 
					 | 
				
			||||||
								target = i;
 | 
					 | 
				
			||||||
								max_x = next->x;
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					} else if (dir == MOVE_LEFT) {
 | 
					 | 
				
			||||||
						if (container->x >= next->x + next->width) {
 | 
					 | 
				
			||||||
							if (target == -1 || max_x < next->x) {
 | 
					 | 
				
			||||||
								target = i;
 | 
					 | 
				
			||||||
								max_x = next->x;
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					} else if (dir == MOVE_DOWN) {
 | 
					 | 
				
			||||||
						if (container->y + container->height <= next->y) {
 | 
					 | 
				
			||||||
							if (target == -1 || next->y < max_y) {
 | 
					 | 
				
			||||||
								target = i;
 | 
					 | 
				
			||||||
								max_y = next->y;
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					} else if (dir == MOVE_UP) {
 | 
					 | 
				
			||||||
						if (container->y >= next->y + next->height) {
 | 
					 | 
				
			||||||
							if (target == -1 || max_y < next->y) {
 | 
					 | 
				
			||||||
								target = i;
 | 
					 | 
				
			||||||
								max_y = next->y;
 | 
					 | 
				
			||||||
							}
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (target == -1) {
 | 
					 | 
				
			||||||
				can_move = false;
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				can_move = true;
 | 
					 | 
				
			||||||
				diff = target - self;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			if (dir == MOVE_LEFT || dir == MOVE_RIGHT) {
 | 
								if (dir == MOVE_LEFT || dir == MOVE_RIGHT) {
 | 
				
			||||||
				if (parent->layout == L_HORIZ) {
 | 
									if (parent->layout == L_HORIZ) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue