Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/examples/window/monitor_info.rs
9328 views
1
//! Displays information about available monitors (displays).
2
3
use bevy::{
4
camera::RenderTarget,
5
prelude::*,
6
window::{ExitCondition, Monitor, WindowMode, WindowRef},
7
};
8
9
fn main() {
10
App::new()
11
.add_plugins(DefaultPlugins.set(WindowPlugin {
12
primary_window: None,
13
exit_condition: ExitCondition::DontExit,
14
..default()
15
}))
16
.add_systems(Update, (update, close_on_esc))
17
.run();
18
}
19
20
#[derive(Component)]
21
struct MonitorRef(Entity);
22
23
fn update(
24
mut commands: Commands,
25
monitors_added: Query<(Entity, &Monitor), Added<Monitor>>,
26
mut monitors_removed: RemovedComponents<Monitor>,
27
monitor_refs: Query<(Entity, &MonitorRef)>,
28
) {
29
for (entity, monitor) in monitors_added.iter() {
30
// Spawn a new window on each monitor
31
let name = monitor.name.clone().unwrap_or_else(|| "<no name>".into());
32
let size = format!("{}x{}px", monitor.physical_height, monitor.physical_width);
33
let hz = monitor
34
.refresh_rate_millihertz
35
.map(|x| format!("{}Hz", x as f32 / 1000.0))
36
.unwrap_or_else(|| "<unknown>".into());
37
let position = format!(
38
"x={} y={}",
39
monitor.physical_position.x, monitor.physical_position.y
40
);
41
let scale = format!("{:.2}", monitor.scale_factor);
42
43
let window = commands
44
.spawn((
45
Window {
46
title: name.clone(),
47
mode: WindowMode::Fullscreen(
48
MonitorSelection::Entity(entity),
49
VideoModeSelection::Current,
50
),
51
position: WindowPosition::Centered(MonitorSelection::Entity(entity)),
52
..default()
53
},
54
MonitorRef(entity),
55
))
56
.id();
57
58
let camera = commands
59
.spawn((Camera2d, RenderTarget::Window(WindowRef::Entity(window))))
60
.id();
61
62
let info_text = format!(
63
"Monitor: {name}\nSize: {size}\nRefresh rate: {hz}\nPosition: {position}\nScale: {scale}\n\n",
64
);
65
commands.spawn((
66
Text(info_text),
67
Node {
68
position_type: PositionType::Relative,
69
height: percent(100),
70
width: percent(100),
71
..default()
72
},
73
UiTargetCamera(camera),
74
MonitorRef(entity),
75
));
76
}
77
78
// Remove windows for removed monitors
79
for monitor_entity in monitors_removed.read() {
80
for (ref_entity, monitor_ref) in monitor_refs.iter() {
81
if monitor_ref.0 == monitor_entity {
82
commands.entity(ref_entity).despawn();
83
}
84
}
85
}
86
}
87
88
fn close_on_esc(
89
mut commands: Commands,
90
focused_windows: Query<(Entity, &Window)>,
91
input: Res<ButtonInput<KeyCode>>,
92
) {
93
for (window, focus) in focused_windows.iter() {
94
if !focus.focused {
95
continue;
96
}
97
98
if input.just_pressed(KeyCode::Escape) {
99
commands.entity(window).despawn();
100
}
101
}
102
}
103
104