Skip to content

Commit 4c087da

Browse files
Log monitor and window information at startup in bevy_winit (#15377)
# Objective Fixes #13979 ## Solution Adds some logging in the create_window function ## Testing - Trivial
1 parent 8a6d0b0 commit 4c087da

File tree

1 file changed

+85
-39
lines changed

1 file changed

+85
-39
lines changed

crates/bevy_winit/src/winit_windows.rs

Lines changed: 85 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -58,43 +58,37 @@ impl WinitWindows {
5858
// AccessKit adapter is initialized.
5959
winit_window_attributes = winit_window_attributes.with_visible(false);
6060

61-
winit_window_attributes = match window.mode {
62-
WindowMode::BorderlessFullscreen(monitor_selection) => winit_window_attributes
63-
.with_fullscreen(Some(Fullscreen::Borderless(select_monitor(
64-
monitors,
65-
event_loop.primary_monitor(),
66-
None,
67-
&monitor_selection,
68-
)))),
69-
mode @ (WindowMode::Fullscreen(_) | WindowMode::SizedFullscreen(_)) => {
70-
let videomode = match mode {
71-
WindowMode::Fullscreen(monitor_selection) => get_best_videomode(
72-
&select_monitor(
73-
monitors,
74-
event_loop.primary_monitor(),
75-
None,
76-
&monitor_selection,
77-
)
78-
.unwrap_or_else(|| {
79-
panic!("Could not find monitor for {:?}", monitor_selection)
80-
}),
81-
),
82-
WindowMode::SizedFullscreen(monitor_selection) => get_fitting_videomode(
83-
&select_monitor(
84-
monitors,
85-
event_loop.primary_monitor(),
86-
None,
87-
&monitor_selection,
88-
)
89-
.unwrap_or_else(|| {
90-
panic!("Could not find monitor for {:?}", monitor_selection)
91-
}),
92-
window.width() as u32,
93-
window.height() as u32,
94-
),
95-
_ => unreachable!(),
96-
};
61+
let maybe_selected_monitor = &match window.mode {
62+
WindowMode::BorderlessFullscreen(monitor_selection)
63+
| WindowMode::Fullscreen(monitor_selection)
64+
| WindowMode::SizedFullscreen(monitor_selection) => select_monitor(
65+
monitors,
66+
event_loop.primary_monitor(),
67+
None,
68+
&monitor_selection,
69+
),
70+
WindowMode::Windowed => None,
71+
};
9772

73+
winit_window_attributes = match window.mode {
74+
WindowMode::BorderlessFullscreen(_) => winit_window_attributes
75+
.with_fullscreen(Some(Fullscreen::Borderless(maybe_selected_monitor.clone()))),
76+
WindowMode::Fullscreen(_) => {
77+
let select_monitor = &maybe_selected_monitor
78+
.clone()
79+
.expect("Unable to get monitor.");
80+
let videomode = get_best_videomode(select_monitor);
81+
winit_window_attributes.with_fullscreen(Some(Fullscreen::Exclusive(videomode)))
82+
}
83+
WindowMode::SizedFullscreen(_) => {
84+
let select_monitor = &maybe_selected_monitor
85+
.clone()
86+
.expect("Unable to get monitor.");
87+
let videomode = get_fitting_videomode(
88+
select_monitor,
89+
window.width() as u32,
90+
window.height() as u32,
91+
);
9892
winit_window_attributes.with_fullscreen(Some(Fullscreen::Exclusive(videomode)))
9993
}
10094
WindowMode::Windowed => {
@@ -107,11 +101,10 @@ impl WinitWindows {
107101
) {
108102
winit_window_attributes = winit_window_attributes.with_position(position);
109103
}
110-
111104
let logical_size = LogicalSize::new(window.width(), window.height());
112105
if let Some(sf) = window.resolution.scale_factor_override() {
113-
winit_window_attributes
114-
.with_inner_size(logical_size.to_physical::<f64>(sf.into()))
106+
let inner_size = logical_size.to_physical::<f64>(sf.into());
107+
winit_window_attributes.with_inner_size(inner_size)
115108
} else {
116109
winit_window_attributes.with_inner_size(logical_size)
117110
}
@@ -134,6 +127,24 @@ impl WinitWindows {
134127
winit_window_attributes.with_skip_taskbar(window.skip_taskbar);
135128
}
136129

130+
let display_info = DisplayInfo {
131+
window_physical_resolution: (
132+
window.resolution.physical_width(),
133+
window.resolution.physical_height(),
134+
),
135+
window_logical_resolution: (window.resolution.width(), window.resolution.height()),
136+
monitor_name: maybe_selected_monitor
137+
.as_ref()
138+
.and_then(MonitorHandle::name),
139+
scale_factor: maybe_selected_monitor
140+
.as_ref()
141+
.map(MonitorHandle::scale_factor),
142+
refresh_rate_millihertz: maybe_selected_monitor
143+
.as_ref()
144+
.and_then(MonitorHandle::refresh_rate_millihertz),
145+
};
146+
bevy_log::debug!("{display_info}");
147+
137148
#[cfg(any(
138149
target_os = "linux",
139150
target_os = "dragonfly",
@@ -449,3 +460,38 @@ pub fn select_monitor(
449460
Entity(entity) => monitors.find_entity(*entity),
450461
}
451462
}
463+
464+
struct DisplayInfo {
465+
window_physical_resolution: (u32, u32),
466+
window_logical_resolution: (f32, f32),
467+
monitor_name: Option<String>,
468+
scale_factor: Option<f64>,
469+
refresh_rate_millihertz: Option<u32>,
470+
}
471+
472+
impl core::fmt::Display for DisplayInfo {
473+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
474+
write!(f, "Display information:")?;
475+
write!(
476+
f,
477+
" Window physical resolution: {}x{}",
478+
self.window_physical_resolution.0, self.window_physical_resolution.1
479+
)?;
480+
write!(
481+
f,
482+
" Window logical resolution: {}x{}",
483+
self.window_logical_resolution.0, self.window_logical_resolution.1
484+
)?;
485+
write!(
486+
f,
487+
" Monitor name: {}",
488+
self.monitor_name.as_deref().unwrap_or("")
489+
)?;
490+
write!(f, " Scale factor: {}", self.scale_factor.unwrap_or(0.))?;
491+
let millihertz = self.refresh_rate_millihertz.unwrap_or(0);
492+
let hertz = millihertz / 1000;
493+
let extra_millihertz = millihertz % 1000;
494+
write!(f, " Refresh rate (Hz): {}.{:03}", hertz, extra_millihertz)?;
495+
Ok(())
496+
}
497+
}

0 commit comments

Comments
 (0)