|  |  |  | @ -34,6 +34,34 @@ static void bar_init(struct swaybar *bar) { | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_list_init(&bar->outputs); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void swaybar_output_free(struct swaybar_output *output) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!output) { | 
			
		
	
		
			
				
					|  |  |  |  | 		return; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_log(L_DEBUG, "Removing output %s", output->name); | 
			
		
	
		
			
				
					|  |  |  |  | 	zwlr_layer_surface_v1_destroy(output->layer_surface); | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_surface_destroy(output->surface); | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_output_destroy(output->output); | 
			
		
	
		
			
				
					|  |  |  |  | 	destroy_buffer(&output->buffers[0]); | 
			
		
	
		
			
				
					|  |  |  |  | 	destroy_buffer(&output->buffers[1]); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct swaybar_workspace *ws, *ws_tmp; | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_list_for_each_safe(ws, ws_tmp, &output->workspaces, link) { | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_list_remove(&ws->link); | 
			
		
	
		
			
				
					|  |  |  |  | 		free(ws->name); | 
			
		
	
		
			
				
					|  |  |  |  | 		free(ws); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	struct swaybar_hotspot *hotspot, *hotspot_tmp; | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_list_for_each_safe(hotspot, hotspot_tmp, &output->hotspots, link) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (hotspot->destroy) { | 
			
		
	
		
			
				
					|  |  |  |  | 			hotspot->destroy(hotspot->data); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		free(hotspot); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_list_remove(&output->link); | 
			
		
	
		
			
				
					|  |  |  |  | 	free(output->name); | 
			
		
	
		
			
				
					|  |  |  |  | 	free(output); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void layer_surface_configure(void *data, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct zwlr_layer_surface_v1 *surface, | 
			
		
	
		
			
				
					|  |  |  |  | 		uint32_t serial, uint32_t width, uint32_t height) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -46,10 +74,8 @@ static void layer_surface_configure(void *data, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void layer_surface_closed(void *_output, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct zwlr_layer_surface_v1 *surface) { | 
			
		
	
		
			
				
					|  |  |  |  | 	// TODO: Deal with hotplugging
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct swaybar_output *output = _output; | 
			
		
	
		
			
				
					|  |  |  |  | 	zwlr_layer_surface_v1_destroy(output->layer_surface); | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_surface_destroy(output->surface); | 
			
		
	
		
			
				
					|  |  |  |  | 	swaybar_output_free(output); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | struct zwlr_layer_surface_v1_listener layer_surface_listener = { | 
			
		
	
	
		
			
				
					|  |  |  | @ -261,6 +287,7 @@ static void handle_global(void *data, struct wl_registry *registry, | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_output_add_listener(output->output, &output_listener, output); | 
			
		
	
		
			
				
					|  |  |  |  | 		output->scale = 1; | 
			
		
	
		
			
				
					|  |  |  |  | 		output->index = index++; | 
			
		
	
		
			
				
					|  |  |  |  | 		output->wl_name = name; | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_list_init(&output->workspaces); | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_list_init(&output->hotspots); | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_list_insert(&bar->outputs, &output->link); | 
			
		
	
	
		
			
				
					|  |  |  | @ -272,7 +299,14 @@ static void handle_global(void *data, struct wl_registry *registry, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_global_remove(void *data, struct wl_registry *registry, | 
			
		
	
		
			
				
					|  |  |  |  | 		uint32_t name) { | 
			
		
	
		
			
				
					|  |  |  |  | 	// who cares
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct swaybar *bar = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	struct swaybar_output *output, *tmp; | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_list_for_each_safe(output, tmp, &bar->outputs, link) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (output->wl_name == name) { | 
			
		
	
		
			
				
					|  |  |  |  | 			swaybar_output_free(output); | 
			
		
	
		
			
				
					|  |  |  |  | 			break; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static const struct wl_registry_listener registry_listener = { | 
			
		
	
	
		
			
				
					|  |  |  | 
 |