mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Handle focus changes
And some simple refactoring
This commit is contained in:
		
							parent
							
								
									c7be30d912
								
							
						
					
					
						commit
						4181c36862
					
				
					 1 changed files with 48 additions and 12 deletions
				
			
		| 
						 | 
					@ -11,22 +11,17 @@ void arrange_windows(swayc_t *container, int width, int height) {
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	if (width == -1 || height == -1) {
 | 
						if (width == -1 || height == -1) {
 | 
				
			||||||
		sway_log(L_DEBUG, "Arranging layout for %p", container);
 | 
							sway_log(L_DEBUG, "Arranging layout for %p", container);
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (width == -1) {
 | 
					 | 
				
			||||||
		width = container->width;
 | 
							width = container->width;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (height == -1) {
 | 
					 | 
				
			||||||
		height = container->height;
 | 
							height = container->height;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (container->type == C_ROOT) {
 | 
						switch (container->type) {
 | 
				
			||||||
 | 
						case C_ROOT:
 | 
				
			||||||
		for (i = 0; i < container->children->length; ++i) {
 | 
							for (i = 0; i < container->children->length; ++i) {
 | 
				
			||||||
			arrange_windows(container->children->items[i], -1, -1);
 | 
								arrange_windows(container->children->items[i], -1, -1);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						case C_VIEW:
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (container->type == C_VIEW) {
 | 
					 | 
				
			||||||
		sway_log(L_DEBUG, "Setting view to %d x %d @ %d, %d", width, height, container->x, container->y);
 | 
							sway_log(L_DEBUG, "Setting view to %d x %d @ %d, %d", width, height, container->x, container->y);
 | 
				
			||||||
		struct wlc_geometry geometry = {
 | 
							struct wlc_geometry geometry = {
 | 
				
			||||||
			.origin = {
 | 
								.origin = {
 | 
				
			||||||
| 
						 | 
					@ -39,10 +34,14 @@ void arrange_windows(swayc_t *container, int width, int height) {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		wlc_view_set_geometry(container->handle, &geometry);
 | 
							wlc_view_set_geometry(container->handle, &geometry);
 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
		container->width = width;
 | 
							container->width = width;
 | 
				
			||||||
		container->height = height;
 | 
							container->height = height;
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							container->width = width;
 | 
				
			||||||
 | 
							container->height = height;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	double total_weight = 0;
 | 
						double total_weight = 0;
 | 
				
			||||||
	for (i = 0; i < container->children->length; ++i) {
 | 
						for (i = 0; i < container->children->length; ++i) {
 | 
				
			||||||
| 
						 | 
					@ -66,12 +65,25 @@ void arrange_windows(swayc_t *container, int width, int height) {
 | 
				
			||||||
			x += w;
 | 
								x += w;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case L_VERT:
 | 
				
			||||||
 | 
							for (i = 0; i < container->children->length; ++i) {
 | 
				
			||||||
 | 
								swayc_t *child = container->children->items[i];
 | 
				
			||||||
 | 
								double percent = child->weight / total_weight;
 | 
				
			||||||
 | 
								sway_log(L_DEBUG, "Calculating arrangement for %p:%d (will receive %.2f of %d)", child, child->type, percent, width);
 | 
				
			||||||
 | 
								child->x = x + container->x;
 | 
				
			||||||
 | 
								child->y = y + container->y;
 | 
				
			||||||
 | 
								int w = width;
 | 
				
			||||||
 | 
								int h = height * percent;
 | 
				
			||||||
 | 
								arrange_windows(child, w, h);
 | 
				
			||||||
 | 
								y += h;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void init_layout() {
 | 
					void init_layout() {
 | 
				
			||||||
	root_container.type = C_ROOT;
 | 
						root_container.type = C_ROOT;
 | 
				
			||||||
	root_container.layout = L_HORIZ; // TODO: Default layout
 | 
						root_container.layout = L_NONE;
 | 
				
			||||||
	root_container.children = create_list();
 | 
						root_container.children = create_list();
 | 
				
			||||||
	root_container.handle = -1;
 | 
						root_container.handle = -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -146,12 +158,36 @@ void destroy_view(swayc_t *view) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free_swayc(view);
 | 
						free_swayc(view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO: Focus some other window
 | 
						if (parent->children->length != 0) {
 | 
				
			||||||
 | 
							focus_view(parent->children->items[0]);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							focus_view(parent);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	arrange_windows(parent, -1, -1);
 | 
						arrange_windows(parent, -1, -1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void unfocus_all(swayc_t *container) {
 | 
				
			||||||
 | 
						if (container->children == NULL) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						for (i = 0; i < container->children->length; ++i) {
 | 
				
			||||||
 | 
							swayc_t *view = container->children->items[i];
 | 
				
			||||||
 | 
							if (view->type == C_VIEW) {
 | 
				
			||||||
 | 
								wlc_view_set_state(view->handle, WLC_BIT_ACTIVATED, false);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								unfocus_all(view);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void focus_view(swayc_t *view) {
 | 
					void focus_view(swayc_t *view) {
 | 
				
			||||||
 | 
						if (view->type == C_VIEW) {
 | 
				
			||||||
 | 
							unfocus_all(&root_container);
 | 
				
			||||||
 | 
							wlc_view_set_state(view->handle, WLC_BIT_ACTIVATED, true);
 | 
				
			||||||
 | 
							wlc_view_focus(view->handle);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if (view == &root_container) {
 | 
						if (view == &root_container) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue