mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Prevent duplicate workspace::focus events
Previously we would compare the last focus's workspace with the new focus's workspace to determine if we need to emit an IPC workspace::focus event. This doesn't work when moving the focused container to a new workspace. This adds a workspace property to the seat which stores the last emitted workspace::focus workspace. Using this method, after moving the container, refocusing it will trigger exactly one workspace::focus event: from the old workspace to the new workspace.
This commit is contained in:
		
							parent
							
								
									26278b694c
								
							
						
					
					
						commit
						05284b65db
					
				
					 3 changed files with 12 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -51,6 +51,7 @@ struct sway_seat {
 | 
			
		|||
 | 
			
		||||
	bool has_focus;
 | 
			
		||||
	struct wl_list focus_stack; // list of containers in focus order
 | 
			
		||||
	struct sway_workspace *workspace;
 | 
			
		||||
 | 
			
		||||
	// If the focused layer is set, views cannot receive keyboard focus
 | 
			
		||||
	struct wlr_layer_surface_v1 *focused_layer;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -704,7 +704,7 @@ static struct cmd_results *cmd_move_in_direction(
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Hack to re-focus container
 | 
			
		||||
	seat_set_focus_workspace(config->handler_context.seat, new_ws);
 | 
			
		||||
	seat_set_raw_focus(config->handler_context.seat, &new_ws->node);
 | 
			
		||||
	seat_set_focus_container(config->handler_context.seat, container);
 | 
			
		||||
 | 
			
		||||
	if (old_ws != new_ws) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -623,6 +623,15 @@ static void container_raise_floating(struct sway_container *con) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void set_workspace(struct sway_seat *seat,
 | 
			
		||||
		struct sway_workspace *new_ws) {
 | 
			
		||||
	if (seat->workspace == new_ws) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	ipc_event_workspace(seat->workspace, new_ws, "focus");
 | 
			
		||||
	seat->workspace = new_ws;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void seat_set_raw_focus(struct sway_seat *seat, struct sway_node *node) {
 | 
			
		||||
	struct sway_seat_node *seat_node = seat_node_from_node(seat, node);
 | 
			
		||||
	wl_list_remove(&seat_node->link);
 | 
			
		||||
| 
						 | 
				
			
			@ -709,9 +718,7 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// emit ipc events
 | 
			
		||||
	if (new_workspace && last_workspace != new_workspace) {
 | 
			
		||||
		 ipc_event_workspace(last_workspace, new_workspace, "focus");
 | 
			
		||||
	}
 | 
			
		||||
	set_workspace(seat, new_workspace);
 | 
			
		||||
	if (container && container->view) {
 | 
			
		||||
		ipc_event_window(container, "focus");
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue