mirror of
https://github.com/bevyengine/bevy
synced 2024-11-13 00:17:27 +00:00
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>
69 lines
2.2 KiB
Rust
69 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,
|
|
}
|