added option for borderless fullscreen in setting -> graphics menu

This commit is contained in:
Raiyan Sayeed 2020-09-07 05:12:15 +00:00 committed by Imbris
parent b933db8b68
commit 906da2f0c7
10 changed files with 511 additions and 505 deletions

View File

@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Some more combat sound effects - Some more combat sound effects
- Beehives and bees - Beehives and bees
- Fireflies - Fireflies
- Fullscreen modes now show two options (exclusive and borderless)
### Changed ### Changed

719
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -299,11 +299,14 @@ magically infused items?"#,
"hud.settings.fluid_rendering_mode.cheap": "Cheap", "hud.settings.fluid_rendering_mode.cheap": "Cheap",
"hud.settings.fluid_rendering_mode.shiny": "Shiny", "hud.settings.fluid_rendering_mode.shiny": "Shiny",
"hud.settings.cloud_rendering_mode.regular": "Regular", "hud.settings.cloud_rendering_mode.regular": "Regular",
"hud.settings.fullscreen": "Fullscreen",
"hud.settings.fullscreen_mode": "Fullscreen Mode",
"hud.settings.fullscreen_mode.exclusive": "Exclusive",
"hud.settings.fullscreen_mode.borderless": "Borderless",
"hud.settings.particles": "Particles", "hud.settings.particles": "Particles",
"hud.settings.resolution": "Resolution", "hud.settings.resolution": "Resolution",
"hud.settings.bit_depth": "Bit Depth", "hud.settings.bit_depth": "Bit Depth",
"hud.settings.refresh_rate": "Refresh Rate", "hud.settings.refresh_rate": "Refresh Rate",
"hud.settings.fullscreen": "Fullscreen",
"hud.settings.save_window_size": "Save window size", "hud.settings.save_window_size": "Save window size",
"hud.settings.lighting_rendering_mode": "Lighting Rendering Mode", "hud.settings.lighting_rendering_mode": "Lighting Rendering Mode",
"hud.settings.lighting_rendering_mode.ashikhmin": "Type A", "hud.settings.lighting_rendering_mode.ashikhmin": "Type A",

View File

@ -19,7 +19,6 @@ mod social;
mod spell; mod spell;
mod util; mod util;
use crate::{ecs::comp::HpFloaterList, hud::img_ids::ImgsRot, ui::img_ids::Rotations};
pub use hotbar::{SlotContents as HotbarSlotContents, State as HotbarState}; pub use hotbar::{SlotContents as HotbarSlotContents, State as HotbarState};
pub use settings_window::ScaleChange; pub use settings_window::ScaleChange;
@ -44,15 +43,16 @@ use social::{Social, SocialTab};
use spell::Spell; use spell::Spell;
use crate::{ use crate::{
ecs::comp as vcomp, ecs::{comp as vcomp, comp::HpFloaterList},
hud::img_ids::ImgsRot,
i18n::{i18n_asset_key, LanguageMetadata, VoxygenLocalization}, i18n::{i18n_asset_key, LanguageMetadata, VoxygenLocalization},
render::{Consts, Globals, RenderMode, Renderer}, render::{Consts, Globals, RenderMode, Renderer},
scene::{ scene::{
camera::{self, Camera}, camera::{self, Camera},
lod, lod,
}, },
ui::{fonts::ConrodVoxygenFonts, slot, Graphic, Ingameable, ScaleMode, Ui}, ui::{fonts::ConrodVoxygenFonts, img_ids::Rotations, slot, Graphic, Ingameable, ScaleMode, Ui},
window::{Event as WinEvent, GameInput}, window::{Event as WinEvent, FullScreenSettings, GameInput},
GlobalState, GlobalState,
}; };
use client::Client; use client::Client;
@ -285,11 +285,8 @@ pub enum Event {
ChangeGamma(f32), ChangeGamma(f32),
MapZoom(f64), MapZoom(f64),
AdjustWindowSize([u16; 2]), AdjustWindowSize([u16; 2]),
ChangeFullscreenMode(FullScreenSettings),
ToggleParticlesEnabled(bool), ToggleParticlesEnabled(bool),
ToggleFullscreen,
ChangeResolution([u16; 2]),
ChangeBitDepth(Option<u16>),
ChangeRefreshRate(Option<u16>),
CrosshairTransp(f32), CrosshairTransp(f32),
ChatTransp(f32), ChatTransp(f32),
ChatCharName(bool), ChatCharName(bool),
@ -1972,24 +1969,15 @@ impl Hud {
settings_window::Event::ChangeRenderMode(new_render_mode) => { settings_window::Event::ChangeRenderMode(new_render_mode) => {
events.push(Event::ChangeRenderMode(new_render_mode)); events.push(Event::ChangeRenderMode(new_render_mode));
}, },
settings_window::Event::ChangeResolution(new_resolution) => {
events.push(Event::ChangeResolution(new_resolution));
},
settings_window::Event::ChangeBitDepth(new_bit_depth) => {
events.push(Event::ChangeBitDepth(new_bit_depth));
},
settings_window::Event::ChangeRefreshRate(new_refresh_rate) => {
events.push(Event::ChangeRefreshRate(new_refresh_rate));
},
settings_window::Event::ChangeLanguage(language) => { settings_window::Event::ChangeLanguage(language) => {
events.push(Event::ChangeLanguage(language)); events.push(Event::ChangeLanguage(language));
}, },
settings_window::Event::ChangeFullscreenMode(new_fullscreen_settings) => {
events.push(Event::ChangeFullscreenMode(new_fullscreen_settings));
},
settings_window::Event::ToggleParticlesEnabled(particles_enabled) => { settings_window::Event::ToggleParticlesEnabled(particles_enabled) => {
events.push(Event::ToggleParticlesEnabled(particles_enabled)); events.push(Event::ToggleParticlesEnabled(particles_enabled));
}, },
settings_window::Event::ToggleFullscreen => {
events.push(Event::ToggleFullscreen);
},
settings_window::Event::AdjustWindowSize(new_size) => { settings_window::Event::AdjustWindowSize(new_size) => {
events.push(Event::AdjustWindowSize(new_size)); events.push(Event::AdjustWindowSize(new_size));
}, },

View File

@ -6,7 +6,7 @@ use crate::{
i18n::{list_localizations, LanguageMetadata, VoxygenLocalization}, i18n::{list_localizations, LanguageMetadata, VoxygenLocalization},
render::{AaMode, CloudMode, FluidMode, LightingMode, RenderMode, ShadowMapMode, ShadowMode}, render::{AaMode, CloudMode, FluidMode, LightingMode, RenderMode, ShadowMapMode, ShadowMode},
ui::{fonts::ConrodVoxygenFonts, ImageSlider, ScaleMode, ToggleButton}, ui::{fonts::ConrodVoxygenFonts, ImageSlider, ScaleMode, ToggleButton},
window::GameInput, window::{FullScreenSettings, FullscreenMode, GameInput},
GlobalState, GlobalState,
}; };
use conrod_core::{ use conrod_core::{
@ -119,6 +119,8 @@ widget_ids! {
cloud_mode_list, cloud_mode_list,
fluid_mode_text, fluid_mode_text,
fluid_mode_list, fluid_mode_list,
fullscreen_mode_text,
fullscreen_mode_list,
// //
resolution, resolution,
resolution_label, resolution_label,
@ -259,12 +261,9 @@ pub enum Event {
AdjustLodDetail(u32), AdjustLodDetail(u32),
AdjustGamma(f32), AdjustGamma(f32),
AdjustWindowSize([u16; 2]), AdjustWindowSize([u16; 2]),
ChangeFullscreenMode(FullScreenSettings),
ToggleParticlesEnabled(bool), ToggleParticlesEnabled(bool),
ToggleFullscreen,
ChangeRenderMode(Box<RenderMode>), ChangeRenderMode(Box<RenderMode>),
ChangeResolution([u16; 2]),
ChangeBitDepth(Option<u16>),
ChangeRefreshRate(Option<u16>),
AdjustMusicVolume(f32), AdjustMusicVolume(f32),
AdjustSfxVolume(f32), AdjustSfxVolume(f32),
ChangeAudioDevice(String), ChangeAudioDevice(String),
@ -2284,9 +2283,9 @@ impl<'a> Widget for SettingsWindow<'a> {
.map(|res| format!("{}x{}", res[0], res[1])) .map(|res| format!("{}x{}", res[0], res[1]))
.collect::<Vec<String>>() .collect::<Vec<String>>()
.as_slice(), .as_slice(),
resolutions resolutions.iter().position(|res| {
.iter() res == &self.global_state.settings.graphics.fullscreen.resolution
.position(|res| res == &self.global_state.settings.graphics.resolution), }),
) )
.w_h(128.0, 22.0) .w_h(128.0, 22.0)
.color(MENU_BG) .color(MENU_BG)
@ -2295,17 +2294,22 @@ impl<'a> Widget for SettingsWindow<'a> {
.down_from(state.ids.resolution_label, 10.0) .down_from(state.ids.resolution_label, 10.0)
.set(state.ids.resolution, ui) .set(state.ids.resolution, ui)
{ {
events.push(Event::ChangeResolution(resolutions[clicked])); events.push(Event::ChangeFullscreenMode(FullScreenSettings {
resolution: resolutions[clicked],
..self.global_state.settings.graphics.fullscreen
}));
} }
// Bit Depth and Refresh Rate // Bit Depth and Refresh Rate
let correct_res: Vec<VideoMode> = video_modes let correct_res: Vec<VideoMode> = video_modes
.into_iter() .into_iter()
.filter(|mode| { .filter(|mode| {
mode.size().width == self.global_state.settings.graphics.resolution[0] as u32 mode.size().width
== self.global_state.settings.graphics.fullscreen.resolution[0] as u32
}) })
.filter(|mode| { .filter(|mode| {
mode.size().height == self.global_state.settings.graphics.resolution[1] as u32 mode.size().height
== self.global_state.settings.graphics.fullscreen.resolution[1] as u32
}) })
.collect(); .collect();
@ -2313,7 +2317,7 @@ impl<'a> Widget for SettingsWindow<'a> {
let bit_depths: Vec<u16> = correct_res let bit_depths: Vec<u16> = correct_res
.iter() .iter()
.filter( .filter(
|mode| match self.global_state.settings.graphics.refresh_rate { |mode| match self.global_state.settings.graphics.fullscreen.refresh_rate {
Some(refresh_rate) => mode.refresh_rate() == refresh_rate, Some(refresh_rate) => mode.refresh_rate() == refresh_rate,
None => true, None => true,
}, },
@ -2337,7 +2341,7 @@ impl<'a> Widget for SettingsWindow<'a> {
.chain(bit_depths.iter().map(|depth| format!("{}", depth))) .chain(bit_depths.iter().map(|depth| format!("{}", depth)))
.collect::<Vec<String>>() .collect::<Vec<String>>()
.as_slice(), .as_slice(),
match self.global_state.settings.graphics.bit_depth { match self.global_state.settings.graphics.fullscreen.bit_depth {
Some(bit_depth) => bit_depths Some(bit_depth) => bit_depths
.iter() .iter()
.position(|depth| depth == &bit_depth) .position(|depth| depth == &bit_depth)
@ -2353,20 +2357,25 @@ impl<'a> Widget for SettingsWindow<'a> {
.right_from(state.ids.resolution, 8.0) .right_from(state.ids.resolution, 8.0)
.set(state.ids.bit_depth, ui) .set(state.ids.bit_depth, ui)
{ {
events.push(Event::ChangeBitDepth(if clicked == 0 { events.push(Event::ChangeFullscreenMode(FullScreenSettings {
bit_depth: if clicked == 0 {
None None
} else { } else {
Some(bit_depths[clicked - 1]) Some(bit_depths[clicked - 1])
},
..self.global_state.settings.graphics.fullscreen
})); }));
} }
// Refresh Rate // Refresh Rate
let refresh_rates: Vec<u16> = correct_res let refresh_rates: Vec<u16> = correct_res
.into_iter() .into_iter()
.filter(|mode| match self.global_state.settings.graphics.bit_depth { .filter(
|mode| match self.global_state.settings.graphics.fullscreen.bit_depth {
Some(bit_depth) => mode.bit_depth() == bit_depth, Some(bit_depth) => mode.bit_depth() == bit_depth,
None => true, None => true,
}) },
)
.sorted_by_key(|mode| mode.refresh_rate()) .sorted_by_key(|mode| mode.refresh_rate())
.map(|mode| mode.refresh_rate()) .map(|mode| mode.refresh_rate())
.rev() .rev()
@ -2386,7 +2395,7 @@ impl<'a> Widget for SettingsWindow<'a> {
.chain(refresh_rates.iter().map(|rate| format!("{}", rate))) .chain(refresh_rates.iter().map(|rate| format!("{}", rate)))
.collect::<Vec<String>>() .collect::<Vec<String>>()
.as_slice(), .as_slice(),
match self.global_state.settings.graphics.refresh_rate { match self.global_state.settings.graphics.fullscreen.refresh_rate {
Some(refresh_rate) => refresh_rates Some(refresh_rate) => refresh_rates
.iter() .iter()
.position(|rate| rate == &refresh_rate) .position(|rate| rate == &refresh_rate)
@ -2402,10 +2411,13 @@ impl<'a> Widget for SettingsWindow<'a> {
.right_from(state.ids.bit_depth, 8.0) .right_from(state.ids.bit_depth, 8.0)
.set(state.ids.refresh_rate, ui) .set(state.ids.refresh_rate, ui)
{ {
events.push(Event::ChangeRefreshRate(if clicked == 0 { events.push(Event::ChangeFullscreenMode(FullScreenSettings {
refresh_rate: if clicked == 0 {
None None
} else { } else {
Some(refresh_rates[clicked - 1]) Some(refresh_rates[clicked - 1])
},
..self.global_state.settings.graphics.fullscreen
})); }));
} }
@ -2417,8 +2429,8 @@ impl<'a> Widget for SettingsWindow<'a> {
.color(TEXT_COLOR) .color(TEXT_COLOR)
.set(state.ids.fullscreen_label, ui); .set(state.ids.fullscreen_label, ui);
let fullscreen = ToggleButton::new( let enabled = ToggleButton::new(
self.global_state.settings.graphics.fullscreen, self.global_state.settings.graphics.fullscreen.enabled,
self.imgs.checkbox, self.imgs.checkbox,
self.imgs.checkbox_checked, self.imgs.checkbox_checked,
) )
@ -2428,8 +2440,48 @@ impl<'a> Widget for SettingsWindow<'a> {
.press_images(self.imgs.checkbox_press, self.imgs.checkbox_checked) .press_images(self.imgs.checkbox_press, self.imgs.checkbox_checked)
.set(state.ids.fullscreen_button, ui); .set(state.ids.fullscreen_button, ui);
if self.global_state.settings.graphics.fullscreen != fullscreen { if self.global_state.settings.graphics.fullscreen.enabled != enabled {
events.push(Event::ToggleFullscreen); events.push(Event::ChangeFullscreenMode(FullScreenSettings {
enabled,
..self.global_state.settings.graphics.fullscreen
}));
}
// Fullscreen Mode
Text::new(&self.localized_strings.get("hud.settings.fullscreen_mode"))
.down_from(state.ids.fullscreen_label, 8.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.fullscreen_mode_text, ui);
let mode_list = [FullscreenMode::Exclusive, FullscreenMode::Borderless];
let mode_label_list = [
&self
.localized_strings
.get("hud.settings.fullscreen_mode.exclusive"),
&self
.localized_strings
.get("hud.settings.fullscreen_mode.borderless"),
];
// Get which fullscreen mode is currently active
let selected = mode_list
.iter()
.position(|x| *x == self.global_state.settings.graphics.fullscreen.mode);
if let Some(clicked) = DropDownList::new(&mode_label_list, selected)
.w_h(400.0, 22.0)
.color(MENU_BG)
.label_color(TEXT_COLOR)
.label_font_id(self.fonts.cyri.conrod_id)
.down_from(state.ids.fullscreen_mode_text, 8.0)
.set(state.ids.fullscreen_mode_list, ui)
{
events.push(Event::ChangeFullscreenMode(FullScreenSettings {
mode: mode_list[clicked],
..self.global_state.settings.graphics.fullscreen
}));
} }
// Save current screen size // Save current screen size
@ -2437,7 +2489,7 @@ impl<'a> Widget for SettingsWindow<'a> {
.w_h(31.0 * 5.0, 12.0 * 2.0) .w_h(31.0 * 5.0, 12.0 * 2.0)
.hover_image(self.imgs.settings_button_hover) .hover_image(self.imgs.settings_button_hover)
.press_image(self.imgs.settings_button_press) .press_image(self.imgs.settings_button_press)
.down_from(state.ids.fullscreen_label, 12.0) .down_from(state.ids.fullscreen_mode_list, 12.0)
.label(&self.localized_strings.get("hud.settings.save_window_size")) .label(&self.localized_strings.get("hud.settings.save_window_size"))
.label_font_size(self.fonts.cyri.scale(14)) .label_font_size(self.fonts.cyri.scale(14))
.label_color(TEXT_COLOR) .label_color(TEXT_COLOR)

View File

@ -1,5 +1,5 @@
use super::{img_ids::Imgs, Show, TEXT_COLOR, UI_MAIN}; use super::{img_ids::Imgs, Show, TEXT_COLOR, UI_MAIN};
use crate::ui::fonts::ConrodVoxygenFonts; use crate::{i18n::VoxygenLocalization, ui::fonts::ConrodVoxygenFonts};
use conrod_core::{ use conrod_core::{
color, color,
widget::{self, Button, Image, Rectangle, Text}, widget::{self, Button, Image, Rectangle, Text},
@ -8,8 +8,6 @@ use conrod_core::{
use client::{self, Client}; use client::{self, Client};
use crate::i18n::VoxygenLocalization;
widget_ids! { widget_ids! {
pub struct Ids { pub struct Ids {
spell_frame, spell_frame,

View File

@ -957,37 +957,6 @@ impl PlayState for SessionState {
global_state.settings.graphics.render_mode = *new_render_mode; global_state.settings.graphics.render_mode = *new_render_mode;
global_state.settings.save_to_file_warn(); global_state.settings.save_to_file_warn();
}, },
HudEvent::ChangeResolution(new_resolution) => {
// Do this first so if it crashes the setting isn't saved :)
global_state.window.fullscreen(
global_state.settings.graphics.fullscreen,
new_resolution,
global_state.settings.graphics.bit_depth,
global_state.settings.graphics.refresh_rate,
);
global_state.settings.graphics.resolution = new_resolution;
global_state.settings.save_to_file_warn();
},
HudEvent::ChangeBitDepth(new_bit_depth) => {
global_state.window.fullscreen(
global_state.settings.graphics.fullscreen,
global_state.settings.graphics.resolution,
new_bit_depth,
global_state.settings.graphics.refresh_rate,
);
global_state.settings.graphics.bit_depth = new_bit_depth;
global_state.settings.save_to_file_warn();
},
HudEvent::ChangeRefreshRate(new_refresh_rate) => {
global_state.window.fullscreen(
global_state.settings.graphics.fullscreen,
global_state.settings.graphics.resolution,
global_state.settings.graphics.bit_depth,
new_refresh_rate,
);
global_state.settings.graphics.refresh_rate = new_refresh_rate;
global_state.settings.save_to_file_warn();
},
HudEvent::ChangeLanguage(new_language) => { HudEvent::ChangeLanguage(new_language) => {
global_state.settings.language.selected_language = global_state.settings.language.selected_language =
new_language.language_identifier; new_language.language_identifier;
@ -999,15 +968,17 @@ impl PlayState for SessionState {
self.voxygen_i18n.log_missing_entries(); self.voxygen_i18n.log_missing_entries();
self.hud.update_language(self.voxygen_i18n.clone()); self.hud.update_language(self.voxygen_i18n.clone());
}, },
HudEvent::ChangeFullscreenMode(new_fullscreen_settings) => {
global_state
.window
.set_fullscreen_mode(new_fullscreen_settings);
global_state.settings.graphics.fullscreen = new_fullscreen_settings;
global_state.settings.save_to_file_warn();
},
HudEvent::ToggleParticlesEnabled(particles_enabled) => { HudEvent::ToggleParticlesEnabled(particles_enabled) => {
global_state.settings.graphics.particles_enabled = particles_enabled; global_state.settings.graphics.particles_enabled = particles_enabled;
global_state.settings.save_to_file_warn(); global_state.settings.save_to_file_warn();
}, },
HudEvent::ToggleFullscreen => {
global_state
.window
.toggle_fullscreen(&mut global_state.settings);
},
HudEvent::AdjustWindowSize(new_size) => { HudEvent::AdjustWindowSize(new_size) => {
global_state.window.set_size(new_size.into()); global_state.window.set_size(new_size.into());
global_state.settings.graphics.window_size = new_size; global_state.settings.graphics.window_size = new_size;

View File

@ -3,7 +3,7 @@ use crate::{
i18n, i18n,
render::RenderMode, render::RenderMode,
ui::ScaleMode, ui::ScaleMode,
window::{GameInput, KeyMouse}, window::{FullScreenSettings, GameInput, KeyMouse},
}; };
use directories_next::{ProjectDirs, UserDirs}; use directories_next::{ProjectDirs, UserDirs};
use hashbrown::{HashMap, HashSet}; use hashbrown::{HashMap, HashSet};
@ -617,11 +617,8 @@ pub struct GraphicsSettings {
pub fov: u16, pub fov: u16,
pub gamma: f32, pub gamma: f32,
pub render_mode: RenderMode, pub render_mode: RenderMode,
pub resolution: [u16; 2],
pub bit_depth: Option<u16>,
pub refresh_rate: Option<u16>,
pub window_size: [u16; 2], pub window_size: [u16; 2],
pub fullscreen: bool, pub fullscreen: FullScreenSettings,
pub lod_detail: u32, pub lod_detail: u32,
} }
@ -636,11 +633,8 @@ impl Default for GraphicsSettings {
fov: 50, fov: 50,
gamma: 1.0, gamma: 1.0,
render_mode: RenderMode::default(), render_mode: RenderMode::default(),
resolution: [1920, 1080],
bit_depth: None,
refresh_rate: None,
window_size: [1920, 1080], window_size: [1920, 1080],
fullscreen: false, fullscreen: FullScreenSettings::default(),
lod_detail: 300, lod_detail: 300,
} }
} }

View File

@ -65,6 +65,7 @@ enum DrawKind {
// Text and non-textured geometry // Text and non-textured geometry
Plain, Plain,
} }
enum DrawCommand { enum DrawCommand {
Draw { kind: DrawKind, verts: Range<u32> }, Draw { kind: DrawKind, verts: Range<u32> },
Scissor(Aabr<u16>), Scissor(Aabr<u16>),

View File

@ -489,7 +489,7 @@ pub struct Window {
pub zoom_sensitivity: u32, pub zoom_sensitivity: u32,
pub zoom_inversion: bool, pub zoom_inversion: bool,
pub mouse_y_inversion: bool, pub mouse_y_inversion: bool,
fullscreen: bool, fullscreen: FullScreenSettings,
modifiers: winit::event::ModifiersState, modifiers: winit::event::ModifiersState,
needs_refresh_resize: bool, needs_refresh_resize: bool,
keypress_map: HashMap<GameInput, winit::event::ElementState>, keypress_map: HashMap<GameInput, winit::event::ElementState>,
@ -593,7 +593,7 @@ impl Window {
zoom_sensitivity: settings.gameplay.zoom_sensitivity, zoom_sensitivity: settings.gameplay.zoom_sensitivity,
zoom_inversion: settings.gameplay.zoom_inversion, zoom_inversion: settings.gameplay.zoom_inversion,
mouse_y_inversion: settings.gameplay.mouse_y_inversion, mouse_y_inversion: settings.gameplay.mouse_y_inversion,
fullscreen: false, fullscreen: FullScreenSettings::default(),
modifiers: Default::default(), modifiers: Default::default(),
needs_refresh_resize: false, needs_refresh_resize: false,
keypress_map, keypress_map,
@ -611,12 +611,7 @@ impl Window {
toggle_fullscreen: false, toggle_fullscreen: false,
}; };
this.fullscreen( this.set_fullscreen_mode(settings.graphics.fullscreen);
settings.graphics.fullscreen,
settings.graphics.resolution,
settings.graphics.bit_depth,
settings.graphics.refresh_rate,
);
Ok((this, event_loop)) Ok((this, event_loop))
} }
@ -1062,17 +1057,17 @@ impl Window {
} }
pub fn toggle_fullscreen(&mut self, settings: &mut Settings) { pub fn toggle_fullscreen(&mut self, settings: &mut Settings) {
self.fullscreen( let fullscreen = FullScreenSettings {
!self.is_fullscreen(), enabled: !self.is_fullscreen(),
settings.graphics.resolution, ..settings.graphics.fullscreen
settings.graphics.bit_depth, };
settings.graphics.refresh_rate,
); self.set_fullscreen_mode(fullscreen);
settings.graphics.fullscreen = self.is_fullscreen(); settings.graphics.fullscreen = fullscreen;
settings.save_to_file_warn(); settings.save_to_file_warn();
} }
pub fn is_fullscreen(&self) -> bool { self.fullscreen } pub fn is_fullscreen(&self) -> bool { self.fullscreen.enabled }
pub fn select_video_mode_rec( pub fn select_video_mode_rec(
&self, &self,
@ -1250,22 +1245,26 @@ impl Window {
}) })
} }
pub fn fullscreen( pub fn set_fullscreen_mode(&mut self, fullscreen: FullScreenSettings) {
&mut self,
fullscreen: bool,
resolution: [u16; 2],
bit_depth: Option<u16>,
refresh_rate: Option<u16>,
) {
let window = self.window.window(); let window = self.window.window();
self.fullscreen = fullscreen; self.fullscreen = fullscreen;
if fullscreen { window.set_fullscreen(
window.set_fullscreen(Some(winit::window::Fullscreen::Exclusive( fullscreen
self.select_video_mode(resolution, bit_depth, refresh_rate), .enabled
))); .then(|| match fullscreen.mode {
} else { FullscreenMode::Exclusive => {
window.set_fullscreen(None); winit::window::Fullscreen::Exclusive(self.select_video_mode(
} fullscreen.resolution,
fullscreen.bit_depth,
fullscreen.refresh_rate,
))
},
FullscreenMode::Borderless => {
winit::window::Fullscreen::Borderless(window.current_monitor())
},
})
.or_else(|| None),
);
} }
pub fn needs_refresh_resize(&mut self) { self.needs_refresh_resize = true; } pub fn needs_refresh_resize(&mut self) { self.needs_refresh_resize = true; }
@ -1376,3 +1375,33 @@ impl Window {
self.remapping_keybindings = Some(game_input); self.remapping_keybindings = Some(game_input);
} }
} }
#[derive(Copy, Clone, Hash, Eq, PartialEq, Debug, Serialize, Deserialize)]
pub enum FullscreenMode {
Exclusive,
Borderless,
}
impl Default for FullscreenMode {
fn default() -> Self { FullscreenMode::Borderless }
}
#[derive(PartialEq, Clone, Copy, Debug, Serialize, Deserialize)]
pub struct FullScreenSettings {
pub enabled: bool,
pub mode: FullscreenMode,
pub resolution: [u16; 2],
pub bit_depth: Option<u16>,
pub refresh_rate: Option<u16>,
}
impl Default for FullScreenSettings {
fn default() -> Self {
Self {
enabled: false,
mode: FullscreenMode::Borderless,
resolution: [1920, 1080],
bit_depth: None,
refresh_rate: None,
}
}
}