diff options
author | Ben Bridle <ben@derelict.engineering> | 2024-07-31 16:05:57 +1200 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2024-07-31 16:05:57 +1200 |
commit | efe1d21b0e1ee79ef7547c0d8524a39be16ccc7d (patch) | |
tree | 0fb17a9d438cf687a0fa4bbed726219a22088ffd | |
parent | 20bc849cfd990267684532d84b9894204c96189f (diff) | |
download | phosphor-efe1d21b0e1ee79ef7547c0d8524a39be16ccc7d.zip |
Implement fullscreen
Program windows can choose to show as fullscreen or windowed.
-rw-r--r-- | src/window.rs | 15 | ||||
-rw-r--r-- | src/window_controller.rs | 1 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/window.rs b/src/window.rs index 1949387..882d0b8 100644 --- a/src/window.rs +++ b/src/window.rs @@ -3,7 +3,7 @@ use crate::*; use buffer::HasDimensions; use winit::dpi::{Size, PhysicalSize}; use winit::event_loop::EventLoopWindowTarget; -use winit::window::WindowId; +use winit::window::{Fullscreen, WindowId}; pub struct Window { pub controller: Box<dyn WindowController>, @@ -86,6 +86,19 @@ impl Window { /// alter any buffer sizes or struct fields. When the window size eventually /// changes, the state updates are handled by `resize_buffer_and_surface`. pub fn update_window_size(&mut self) { + let fullscreen = self.controller.fullscreen(); + if fullscreen != self.window.fullscreen().is_some() { + if fullscreen { + if let Some(monitor) = self.window.current_monitor() { + if let Some(mode) = monitor.video_modes().nth(0) { + self.window.set_fullscreen(Some(Fullscreen::Exclusive(mode))); + } + }; + } else { + self.window.set_fullscreen(None); + } + } + let pixel_scale = self.controller.pixel_scale().get(); if let Some(dimensions) = self.controller.exact_size() { // Without this early return, the constant re-setting of the window diff --git a/src/window_controller.rs b/src/window_controller.rs index c655d5d..fe23f53 100644 --- a/src/window_controller.rs +++ b/src/window_controller.rs @@ -10,6 +10,7 @@ pub trait WindowController { fn minimum_size(&self) -> Option<Dimensions> { None } fn maximum_size(&self) -> Option<Dimensions> { None } fn exact_size(&self) -> Option<Dimensions> { None } + fn fullscreen(&self) -> bool { false } fn pixel_scale(&self) -> NonZeroU32 { NON_ZERO_ONE } fn cursor_icon(&mut self) -> Option<CursorIcon> { None } |