-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Expose winit's
MonitorHandle
(#13669)
# 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 <[email protected]> Co-authored-by: Alice Cecile <[email protected]> Co-authored-by: Pascal Hertleif <[email protected]>
- Loading branch information
1 parent
897625c
commit 3360b45
Showing
12 changed files
with
428 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
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, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.