 3360b45153
			
		
	
	
		3360b45153
		
			
		
	
	
	
	
		
			
			# Objective Adds a new `Monitor` component representing a winit `MonitorHandle` that can be used to spawn new windows and check for system monitor information. Closes #12955. ## Solution For every winit event, check available monitors and spawn them into the world as components. ## Testing TODO: - [x] Test plugging in and unplugging monitor during app runtime - [x] Test spawning a window on a second monitor by entity id - [ ] Since this touches winit, test all platforms --- ## Changelog - Adds a new `Monitor` component that can be queried for information about available system monitors. ## Migration Guide - `WindowMode` variants now take a `MonitorSelection`, which can be set to `MonitorSelection::Primary` to mirror the old behavior. --------- Co-authored-by: Pascal Hertleif <pascal@technocreatives.com> Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com> Co-authored-by: Pascal Hertleif <killercup@gmail.com>
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use bevy_ecs::component::Component;
 | |
| use bevy_ecs::prelude::ReflectComponent;
 | |
| use bevy_math::{IVec2, UVec2};
 | |
| use bevy_reflect::Reflect;
 | |
| 
 | |
| #[cfg(feature = "serialize")]
 | |
| use bevy_reflect::{ReflectDeserialize, ReflectSerialize};
 | |
| 
 | |
| /// Represents an available monitor as reported by the user's operating system, which can be used
 | |
| /// to query information about the display, such as its size, position, and video modes.
 | |
| ///
 | |
| /// Each monitor corresponds to an entity and can be used to position a monitor using
 | |
| /// [`crate::window::MonitorSelection::Entity`].
 | |
| ///
 | |
| /// # Warning
 | |
| ///
 | |
| /// This component is synchronized with `winit` through `bevy_winit`, but is effectively
 | |
| /// read-only as `winit` does not support changing monitor properties.
 | |
| #[derive(Component, Debug, Clone, Reflect)]
 | |
| #[cfg_attr(
 | |
|     feature = "serialize",
 | |
|     derive(serde::Serialize, serde::Deserialize),
 | |
|     reflect(Serialize, Deserialize)
 | |
| )]
 | |
| #[reflect(Component)]
 | |
| pub struct Monitor {
 | |
|     /// The name of the monitor
 | |
|     pub name: Option<String>,
 | |
|     /// The height of the monitor in physical pixels
 | |
|     pub physical_height: u32,
 | |
|     /// The width of the monitor in physical pixels
 | |
|     pub physical_width: u32,
 | |
|     /// The position of the monitor in physical pixels
 | |
|     pub physical_position: IVec2,
 | |
|     /// The refresh rate of the monitor in millihertz
 | |
|     pub refresh_rate_millihertz: Option<u32>,
 | |
|     /// The scale factor of the monitor
 | |
|     pub scale_factor: f64,
 | |
|     /// The video modes that the monitor supports
 | |
|     pub video_modes: Vec<VideoMode>,
 | |
| }
 | |
| 
 | |
| /// A marker component for the primary monitor
 | |
| #[derive(Component, Debug, Clone, Reflect)]
 | |
| #[reflect(Component)]
 | |
| pub struct PrimaryMonitor;
 | |
| 
 | |
| impl Monitor {
 | |
|     /// Returns the physical size of the monitor in pixels
 | |
|     pub fn physical_size(&self) -> UVec2 {
 | |
|         UVec2::new(self.physical_width, self.physical_height)
 | |
|     }
 | |
| }
 | |
| 
 | |
| /// Represents a video mode that a monitor supports
 | |
| #[derive(Debug, Clone, Reflect)]
 | |
| #[cfg_attr(
 | |
|     feature = "serialize",
 | |
|     derive(serde::Serialize, serde::Deserialize),
 | |
|     reflect(Serialize, Deserialize)
 | |
| )]
 | |
| pub struct VideoMode {
 | |
|     /// The resolution of the video mode
 | |
|     pub physical_size: UVec2,
 | |
|     /// The bit depth of the video mode
 | |
|     pub bit_depth: u16,
 | |
|     /// The refresh rate in millihertz
 | |
|     pub refresh_rate_millihertz: u32,
 | |
| }
 |