mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Move sticky containers in output_evacuate
This commit is contained in:
		
							parent
							
								
									dc01e884f7
								
							
						
					
					
						commit
						8f09ba7885
					
				
					 2 changed files with 30 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -823,9 +823,16 @@ void container_floating_move_to_center(struct sway_container *con) {
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	struct sway_workspace *ws = con->workspace;
 | 
			
		||||
	bool full = con->is_fullscreen;
 | 
			
		||||
	if (full) {
 | 
			
		||||
		container_set_fullscreen(con, false);
 | 
			
		||||
	}
 | 
			
		||||
	double new_lx = ws->x + (ws->width - con->width) / 2;
 | 
			
		||||
	double new_ly = ws->y + (ws->height - con->height) / 2;
 | 
			
		||||
	container_floating_translate(con, new_lx - con->x, new_ly - con->y);
 | 
			
		||||
	if (full) {
 | 
			
		||||
		container_set_fullscreen(con, true);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool find_urgent_iterator(struct sway_container *con, void *data) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,6 +113,20 @@ void output_enable(struct sway_output *output, struct output_config *oc) {
 | 
			
		|||
	arrange_root();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void evacuate_sticky(struct sway_workspace *old_ws,
 | 
			
		||||
		struct sway_output *new_output) {
 | 
			
		||||
	struct sway_workspace *new_ws = output_get_active_workspace(new_output);
 | 
			
		||||
	while (old_ws->floating->length) {
 | 
			
		||||
		struct sway_container *sticky = old_ws->floating->items[0];
 | 
			
		||||
		container_detach(sticky);
 | 
			
		||||
		workspace_add_floating(new_ws, sticky);
 | 
			
		||||
		container_handle_fullscreen_reparent(sticky);
 | 
			
		||||
		container_floating_move_to_center(sticky);
 | 
			
		||||
		ipc_event_window(sticky, "move");
 | 
			
		||||
	}
 | 
			
		||||
	workspace_detect_urgent(new_ws);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void output_evacuate(struct sway_output *output) {
 | 
			
		||||
	if (!output->workspaces->length) {
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			@ -130,17 +144,21 @@ static void output_evacuate(struct sway_output *output) {
 | 
			
		|||
 | 
			
		||||
		workspace_detach(workspace);
 | 
			
		||||
 | 
			
		||||
		if (workspace_is_empty(workspace)) {
 | 
			
		||||
			workspace_begin_destroy(workspace);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		struct sway_output *new_output =
 | 
			
		||||
			workspace_output_get_highest_available(workspace, output);
 | 
			
		||||
		if (!new_output) {
 | 
			
		||||
			new_output = fallback_output;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (workspace_is_empty(workspace)) {
 | 
			
		||||
			// If floating is not empty, there are sticky containers to move
 | 
			
		||||
			if (workspace->floating->length) {
 | 
			
		||||
				evacuate_sticky(workspace, new_output);
 | 
			
		||||
			}
 | 
			
		||||
			workspace_begin_destroy(workspace);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (new_output) {
 | 
			
		||||
			workspace_output_add_priority(workspace, new_output);
 | 
			
		||||
			output_add_workspace(new_output, workspace);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue