mirror of
				https://codeberg.org/dwl/dwl.git
				synced 2025-11-03 09:01:45 -05:00 
			
		
		
		
	Fix crash when disabling focused mon
m->link.next leads to errors if the monitor to disable doesn't have a "next" (right) monitor and is currently focused. dirtmon() does more checks. In some previous commits m->link.next is told to be left monitor, which is wrong Also focusclient() explicitly checks for disabled monitors (this fixes in case of more than one disabled monitor)
This commit is contained in:
		
							parent
							
								
									60a63b637c
								
							
						
					
					
						commit
						25671d7905
					
				
					 1 changed files with 14 additions and 4 deletions
				
			
		
							
								
								
									
										18
									
								
								dwl.c
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								dwl.c
									
										
									
									
									
								
							| 
						 | 
					@ -1459,16 +1459,26 @@ outputmgrapplyortest(struct wlr_output_configuration_v1 *config, bool test)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct wlr_output_configuration_head_v1 *config_head;
 | 
						struct wlr_output_configuration_head_v1 *config_head;
 | 
				
			||||||
	bool ok = true;
 | 
						bool ok = true;
 | 
				
			||||||
 | 
						Arg ar = {.i = -1};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_list_for_each(config_head, &config->heads, link) {
 | 
						wl_list_for_each(config_head, &config->heads, link) {
 | 
				
			||||||
		struct wlr_output *wlr_output = config_head->state.output;
 | 
							struct wlr_output *wlr_output = config_head->state.output;
 | 
				
			||||||
		Monitor *m, *newmon;
 | 
							Monitor *m, *newmon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!config_head->state.enabled) {
 | 
				
			||||||
 | 
								wl_list_for_each(m, &mons, link) {
 | 
				
			||||||
 | 
									if (m->wlr_output->name == wlr_output->name) {
 | 
				
			||||||
 | 
										// make sure that the monitor to clean is focused
 | 
				
			||||||
 | 
										selmon = m;
 | 
				
			||||||
 | 
										focusclient(selclient(), focustop(selmon), 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										// focus the left monitor (relative to the current focus)
 | 
				
			||||||
 | 
										focusmon(&ar);
 | 
				
			||||||
 | 
										closemon(m, wl_container_of(&selmon->link, newmon, link));
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		wlr_output_enable(wlr_output, config_head->state.enabled);
 | 
							wlr_output_enable(wlr_output, config_head->state.enabled);
 | 
				
			||||||
		if (!config_head->state.enabled)
 | 
					 | 
				
			||||||
			wl_list_for_each(m, &mons, link)
 | 
					 | 
				
			||||||
				if (m->wlr_output->name == wlr_output->name)
 | 
					 | 
				
			||||||
					closemon(m, wl_container_of(m->link.next, newmon, link));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (config_head->state.enabled) {
 | 
							if (config_head->state.enabled) {
 | 
				
			||||||
			if (config_head->state.mode)
 | 
								if (config_head->state.mode)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue