mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	seat: allow tree focus changes while layer focused
This allows the focused inactive tree node and visible workspaces to be changed while a surface layer has focus. The layer temporarily loses focus, the tree focus changes, and the layer gets refocused.
This commit is contained in:
		
							parent
							
								
									cc39bbdff3
								
							
						
					
					
						commit
						ab42874f71
					
				
					 2 changed files with 14 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -725,6 +725,10 @@ void seat_set_raw_focus(struct sway_seat *seat, struct sway_node *node) {
 | 
			
		|||
 | 
			
		||||
void seat_set_focus(struct sway_seat *seat, struct sway_node *node) {
 | 
			
		||||
	if (seat->focused_layer) {
 | 
			
		||||
		struct wlr_layer_surface_v1 *layer = seat->focused_layer;
 | 
			
		||||
		seat_set_focus_layer(seat, NULL);
 | 
			
		||||
		seat_set_focus(seat, node);
 | 
			
		||||
		seat_set_focus_layer(seat, layer);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -451,9 +451,15 @@ struct sway_workspace *workspace_prev(struct sway_workspace *current) {
 | 
			
		|||
bool workspace_switch(struct sway_workspace *workspace,
 | 
			
		||||
		bool no_auto_back_and_forth) {
 | 
			
		||||
	struct sway_seat *seat = input_manager_current_seat();
 | 
			
		||||
	struct sway_workspace *active_ws = seat_get_focused_workspace(seat);
 | 
			
		||||
	struct sway_workspace *active_ws = NULL;
 | 
			
		||||
	struct sway_node *focus = seat_get_focus_inactive(seat, &root->node);
 | 
			
		||||
	if (focus && focus->type == N_WORKSPACE) {
 | 
			
		||||
		active_ws = focus->sway_workspace;
 | 
			
		||||
	} else if (focus && focus->type == N_CONTAINER) {
 | 
			
		||||
		active_ws = focus->sway_container->workspace;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!no_auto_back_and_forth && config->auto_back_and_forth
 | 
			
		||||
	if (!no_auto_back_and_forth && config->auto_back_and_forth && active_ws
 | 
			
		||||
			&& active_ws == workspace && seat->prev_workspace_name) {
 | 
			
		||||
		struct sway_workspace *new_ws =
 | 
			
		||||
			workspace_by_name(seat->prev_workspace_name);
 | 
			
		||||
| 
						 | 
				
			
			@ -462,9 +468,9 @@ bool workspace_switch(struct sway_workspace *workspace,
 | 
			
		|||
			workspace_create(NULL, seat->prev_workspace_name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!seat->prev_workspace_name ||
 | 
			
		||||
	if (active_ws && (!seat->prev_workspace_name ||
 | 
			
		||||
			(strcmp(seat->prev_workspace_name, active_ws->name)
 | 
			
		||||
				&& active_ws != workspace)) {
 | 
			
		||||
				&& active_ws != workspace))) {
 | 
			
		||||
		free(seat->prev_workspace_name);
 | 
			
		||||
		seat->prev_workspace_name = malloc(strlen(active_ws->name) + 1);
 | 
			
		||||
		if (!seat->prev_workspace_name) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue