# Objective - When viewport is set to the same size as the window on creation, when adjusting to SizedFullscreen, the window may be smaller than the viewport for a moment, which caused the arguments to be invalid and panic. - Fixes #12000. ## Solution - The fix consists of matching the size of the viewport to the lower size of the window ( if the x value of the window is lower, I update only the x value of the viewport, same for the y value). Also added a test to show that it does not panic anymore. ---
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
//! a test that confirms that 'bevy' does not panic while changing from Windowed to SizedFullscreen when viewport is set
 | 
						|
 | 
						|
use bevy::
 | 
						|
{   prelude::*,
 | 
						|
    render::camera::Viewport,
 | 
						|
    window::WindowMode,
 | 
						|
};
 | 
						|
 | 
						|
//Having a viewport set to the same size as a window used to cause panic on some occasions when switching to SizedFullscreen
 | 
						|
const WINDOW_WIDTH : f32 = 1366.0;
 | 
						|
const WINDOW_HEIGHT: f32 = 768.0;
 | 
						|
 | 
						|
fn main()
 | 
						|
{   //Specify Window Size.
 | 
						|
    let window = Window { resolution: ( WINDOW_WIDTH, WINDOW_HEIGHT ).into(), ..default() };
 | 
						|
    let primary_window = Some ( window );
 | 
						|
 | 
						|
    App::new()
 | 
						|
        .add_plugins( DefaultPlugins.set( WindowPlugin { primary_window, ..default() } ) )
 | 
						|
        .add_systems( Startup, startup )
 | 
						|
        .add_systems( Update, toggle_window_mode )
 | 
						|
        .run();
 | 
						|
}
 | 
						|
 | 
						|
fn startup( mut cmds: Commands )
 | 
						|
{   //Match viewport to Window size.
 | 
						|
    let physical_position = UVec2::new( 0, 0 );
 | 
						|
    let physical_size = Vec2::new( WINDOW_WIDTH, WINDOW_HEIGHT ).as_uvec2();
 | 
						|
    let viewport = Some ( Viewport { physical_position, physical_size, ..default() } );
 | 
						|
 | 
						|
    cmds.spawn( Camera2dBundle::default() ).insert( Camera { viewport, ..default() } );
 | 
						|
}
 | 
						|
 | 
						|
fn toggle_window_mode
 | 
						|
(   mut qry_window: Query<&mut Window>,
 | 
						|
)
 | 
						|
{   let Ok( mut window ) = qry_window.get_single_mut() else { return };
 | 
						|
 | 
						|
    window.mode = match window.mode {
 | 
						|
        WindowMode::Windowed => {
 | 
						|
            //it takes a while for the window to change from windowed to sizedfullscreen and back
 | 
						|
            std::thread::sleep(std::time::Duration::from_secs(4));
 | 
						|
            WindowMode::SizedFullscreen
 | 
						|
        },
 | 
						|
        _  => {
 | 
						|
            std::thread::sleep(std::time::Duration::from_secs(4));
 | 
						|
            WindowMode::Windowed
 | 
						|
        },
 | 
						|
    };
 | 
						|
} |