mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Fallback to other output modes if preferred mode fails
Sometimes the preferred mode is not available due to hardware constraints (e.g. GPU or cable bandwidth limitations). In these cases it's better to fallback to lower modes than to end up with a black screen.
This commit is contained in:
		
							parent
							
								
									f67ed6772c
								
							
						
					
					
						commit
						4cdc4ac63a
					
				
					 1 changed files with 20 additions and 2 deletions
				
			
		| 
						 | 
					@ -357,8 +357,26 @@ static void queue_output_config(struct output_config *oc,
 | 
				
			||||||
		set_mode(wlr_output, oc->width, oc->height,
 | 
							set_mode(wlr_output, oc->width, oc->height,
 | 
				
			||||||
			oc->refresh_rate, oc->custom_mode == 1);
 | 
								oc->refresh_rate, oc->custom_mode == 1);
 | 
				
			||||||
	} else if (!wl_list_empty(&wlr_output->modes)) {
 | 
						} else if (!wl_list_empty(&wlr_output->modes)) {
 | 
				
			||||||
		struct wlr_output_mode *mode = wlr_output_preferred_mode(wlr_output);
 | 
							sway_log(SWAY_DEBUG, "Set preferred mode");
 | 
				
			||||||
 | 
							struct wlr_output_mode *preferred_mode =
 | 
				
			||||||
 | 
								wlr_output_preferred_mode(wlr_output);
 | 
				
			||||||
 | 
							wlr_output_set_mode(wlr_output, preferred_mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!wlr_output_test(wlr_output)) {
 | 
				
			||||||
 | 
								sway_log(SWAY_DEBUG, "Preferred mode rejected, "
 | 
				
			||||||
 | 
									"falling back to another mode");
 | 
				
			||||||
 | 
								struct wlr_output_mode *mode;
 | 
				
			||||||
 | 
								wl_list_for_each(mode, &wlr_output->modes, link) {
 | 
				
			||||||
 | 
									if (mode == preferred_mode) {
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				wlr_output_set_mode(wlr_output, mode);
 | 
									wlr_output_set_mode(wlr_output, mode);
 | 
				
			||||||
 | 
									if (wlr_output_test(wlr_output)) {
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (oc && (oc->subpixel != WL_OUTPUT_SUBPIXEL_UNKNOWN || config->reloading)) {
 | 
						if (oc && (oc->subpixel != WL_OUTPUT_SUBPIXEL_UNKNOWN || config->reloading)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue