mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	tray: when a service is lost, remove all matching items
Before, only the first matching item would be removed, which could leave stale items.
This commit is contained in:
		
							parent
							
								
									c07d91ca96
								
							
						
					
					
						commit
						8dbd4b98f7
					
				
					 1 changed files with 14 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -18,10 +18,6 @@ static int cmp_id(const void *item, const void *cmp_to) {
 | 
			
		|||
	return strcmp(item, cmp_to);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int cmp_service(const void *item, const void *cmp_to) {
 | 
			
		||||
	return strncmp(item, cmp_to, strlen(cmp_to));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_lost_service(sd_bus_message *msg,
 | 
			
		||||
		void *data, sd_bus_error *error) {
 | 
			
		||||
	char *service, *old_owner, *new_owner;
 | 
			
		||||
| 
						 | 
				
			
			@ -33,18 +29,23 @@ static int handle_lost_service(sd_bus_message *msg,
 | 
			
		|||
 | 
			
		||||
	if (!*new_owner) {
 | 
			
		||||
		struct swaybar_watcher *watcher = data;
 | 
			
		||||
		int idx = list_seq_find(watcher->items,
 | 
			
		||||
				using_standard_protocol(watcher) ? cmp_id : cmp_service, service);
 | 
			
		||||
		if (idx != -1) {
 | 
			
		||||
		for (int idx = 0; idx < watcher->items->length; ++idx) {
 | 
			
		||||
			char *id = watcher->items->items[idx];
 | 
			
		||||
			sway_log(SWAY_DEBUG, "Unregistering Status Notifier Item '%s'", id);
 | 
			
		||||
			list_del(watcher->items, idx);
 | 
			
		||||
			sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface,
 | 
			
		||||
					"StatusNotifierItemUnregistered", "s", id);
 | 
			
		||||
			free(id);
 | 
			
		||||
			int cmp_res = using_standard_protocol(watcher) ?
 | 
			
		||||
				cmp_id(id, service) : strncmp(id, service, strlen(service));
 | 
			
		||||
			if (cmp_res == 0) {
 | 
			
		||||
				sway_log(SWAY_DEBUG, "Unregistering Status Notifier Item '%s'", id);
 | 
			
		||||
				list_del(watcher->items, idx--);
 | 
			
		||||
				sd_bus_emit_signal(watcher->bus, obj_path, watcher->interface,
 | 
			
		||||
						"StatusNotifierItemUnregistered", "s", id);
 | 
			
		||||
				free(id);
 | 
			
		||||
				if (using_standard_protocol(watcher)) {
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		idx = list_seq_find(watcher->hosts, cmp_id, service);
 | 
			
		||||
		int idx = list_seq_find(watcher->hosts, cmp_id, service);
 | 
			
		||||
		if (idx != -1) {
 | 
			
		||||
			sway_log(SWAY_DEBUG, "Unregistering Status Notifier Host '%s'", service);
 | 
			
		||||
			free(watcher->hosts->items[idx]);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue