summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2024-07-31 16:05:57 +1200
committerBen Bridle <ben@derelict.engineering>2024-07-31 16:05:57 +1200
commitefe1d21b0e1ee79ef7547c0d8524a39be16ccc7d (patch)
tree0fb17a9d438cf687a0fa4bbed726219a22088ffd
parent20bc849cfd990267684532d84b9894204c96189f (diff)
downloadphosphor-efe1d21b0e1ee79ef7547c0d8524a39be16ccc7d.zip
Implement fullscreen
Program windows can choose to show as fullscreen or windowed.
-rw-r--r--src/window.rs15
-rw-r--r--src/window_controller.rs1
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 }