diff --git a/crates/bevy_winit/src/system.rs b/crates/bevy_winit/src/system.rs index 347fbadcac7da..49ef6c99c7e15 100644 --- a/crates/bevy_winit/src/system.rs +++ b/crates/bevy_winit/src/system.rs @@ -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::{ @@ -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(¤t_monitor), + WindowMode::SizedFullscreen => get_fitting_videomode( + ¤t_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 { diff --git a/crates/bevy_winit/src/winit_windows.rs b/crates/bevy_winit/src/winit_windows.rs index 48757887b883c..085897f21f001 100644 --- a/crates/bevy_winit/src/winit_windows.rs +++ b/crates/bevy_winit/src/winit_windows.rs @@ -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,