mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Fix crash when view unmaps while no outputs connected
When a view unmaps, we call workspace_consider_destroy. This function assumed the workspace would always have an output, but this is not the case when hotplugged down to zero. The function now handles this and allows itself to be destroyed when there is no output. This means that workspace_begin_destroy must remove the workspace from the root->saved_workspaces list to avoid an eventual dangling pointer, so it does that now. Lastly, when an output is plugged in again and it has to create a new initial workspace for it, we must emit the workspace::init IPC event otherwise swaybar shows no workspaces at all. I guess when you start sway, swaybar is started after the workspace has been created which is why this hasn't been needed earlier.
This commit is contained in:
		
							parent
							
								
									5b8257b88f
								
							
						
					
					
						commit
						ed771a6a6e
					
				
					 2 changed files with 12 additions and 3 deletions
				
			
		| 
						 | 
					@ -89,6 +89,7 @@ void output_enable(struct sway_output *output, struct output_config *oc) {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		free(ws_name);
 | 
							free(ws_name);
 | 
				
			||||||
 | 
							ipc_event_workspace(NULL, ws, "init");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	size_t len = sizeof(output->layers) / sizeof(output->layers[0]);
 | 
						size_t len = sizeof(output->layers) / sizeof(output->layers[0]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,6 +119,11 @@ void workspace_begin_destroy(struct sway_workspace *workspace) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (workspace->output) {
 | 
						if (workspace->output) {
 | 
				
			||||||
		workspace_detach(workspace);
 | 
							workspace_detach(workspace);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							int index = list_find(root->saved_workspaces, workspace);
 | 
				
			||||||
 | 
							if (index != -1) {
 | 
				
			||||||
 | 
								list_del(root->saved_workspaces, index);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	workspace->node.destroying = true;
 | 
						workspace->node.destroying = true;
 | 
				
			||||||
| 
						 | 
					@ -126,10 +131,13 @@ void workspace_begin_destroy(struct sway_workspace *workspace) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void workspace_consider_destroy(struct sway_workspace *ws) {
 | 
					void workspace_consider_destroy(struct sway_workspace *ws) {
 | 
				
			||||||
	if (ws->tiling->length == 0 && ws->floating->length == 0
 | 
						if (ws->tiling->length || ws->floating->length) {
 | 
				
			||||||
			&& output_get_active_workspace(ws->output) != ws) {
 | 
							return;
 | 
				
			||||||
		workspace_begin_destroy(ws);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (ws->output && output_get_active_workspace(ws->output) == ws) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						workspace_begin_destroy(ws);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *prev_workspace_name = NULL;
 | 
					char *prev_workspace_name = NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue