Skip to content

Commit

Permalink
Avoid unwraps in winit fullscreen handling code
Browse files Browse the repository at this point in the history
  • Loading branch information
Friz64 committed Feb 6, 2024
1 parent 2a1ebc4 commit e42dacd
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 28 deletions.
44 changes: 27 additions & 17 deletions crates/bevy_winit/src/system.rs
Expand Up @@ -7,7 +7,9 @@ use bevy_ecs::{
system::{NonSendMut, Query, SystemParamItem},
};
use bevy_utils::tracing::{error, info, warn};
use bevy_window::{RawHandleWrapper, Window, WindowClosed, WindowCreated, WindowResized};
use bevy_window::{
RawHandleWrapper, Window, WindowClosed, WindowCreated, WindowMode, WindowResized,
};

use raw_window_handle::{HasDisplayHandle, HasWindowHandle};
use winit::{
Expand Down Expand Up @@ -126,26 +128,34 @@ pub(crate) fn changed_windows(

if window.mode != cache.window.mode {
let new_mode = match window.mode {
bevy_window::WindowMode::BorderlessFullscreen => {
Some(winit::window::Fullscreen::Borderless(None))
}
bevy_window::WindowMode::Fullscreen => {
Some(winit::window::Fullscreen::Exclusive(get_best_videomode(
&winit_window.current_monitor().unwrap(),
)))
WindowMode::BorderlessFullscreen => {
Some(Some(winit::window::Fullscreen::Borderless(None)))
}
bevy_window::WindowMode::SizedFullscreen => {
Some(winit::window::Fullscreen::Exclusive(get_fitting_videomode(
&winit_window.current_monitor().unwrap(),
window.width() as u32,
window.height() as u32,
)))
mode @ (WindowMode::Fullscreen | WindowMode::SizedFullscreen) => {
if let Some(current_monitor) = winit_window.current_monitor() {
let videomode = match mode {
WindowMode::Fullscreen => get_best_videomode(&current_monitor),
WindowMode::SizedFullscreen => get_fitting_videomode(
&current_monitor,
window.width() as u32,
window.height() as u32,
),
_ => unreachable!(),
};

Some(Some(winit::window::Fullscreen::Exclusive(videomode)))
} else {
warn!("Could not determine current monitor, ignoring exclusive fullscreen request for window {:?}", window.title);
None
}
}
bevy_window::WindowMode::Windowed => None,
WindowMode::Windowed => Some(None),
};

if winit_window.fullscreen() != new_mode {
winit_window.set_fullscreen(new_mode);
if let Some(new_mode) = new_mode {
if winit_window.fullscreen() != new_mode {
winit_window.set_fullscreen(new_mode);
}
}
}
if window.resolution != cache.window.resolution {
Expand Down
29 changes: 18 additions & 11 deletions crates/bevy_winit/src/winit_windows.rs
Expand Up @@ -55,18 +55,25 @@ impl WinitWindows {
WindowMode::BorderlessFullscreen => winit_window_builder.with_fullscreen(Some(
winit::window::Fullscreen::Borderless(event_loop.primary_monitor()),
)),
WindowMode::Fullscreen => {
winit_window_builder.with_fullscreen(Some(winit::window::Fullscreen::Exclusive(
get_best_videomode(&event_loop.primary_monitor().unwrap()),
)))
mode @ (WindowMode::Fullscreen | WindowMode::SizedFullscreen) => {
if let Some(primary_monitor) = event_loop.primary_monitor() {
let videomode = match mode {
WindowMode::Fullscreen => get_best_videomode(&primary_monitor),
WindowMode::SizedFullscreen => get_fitting_videomode(
&primary_monitor,
window.width() as u32,
window.height() as u32,
),
_ => unreachable!(),
};

winit_window_builder
.with_fullscreen(Some(winit::window::Fullscreen::Exclusive(videomode)))
} else {
warn!("Could not determine primary monitor, ignoring exclusive fullscreen request for window {:?}", window.title);
winit_window_builder
}
}
WindowMode::SizedFullscreen => winit_window_builder.with_fullscreen(Some(
winit::window::Fullscreen::Exclusive(get_fitting_videomode(
&event_loop.primary_monitor().unwrap(),
window.width() as u32,
window.height() as u32,
)),
)),
WindowMode::Windowed => {
if let Some(position) = winit_window_position(
&window.position,
Expand Down

0 comments on commit e42dacd

Please sign in to comment.