From 6cd2c326d816c6603ae292b5a780b0358f29cbe7 Mon Sep 17 00:00:00 2001 From: Observer KRypt0n_ Date: Fri, 1 Jul 2022 21:04:12 +0200 Subject: [PATCH] Added wine sync and fsr options syncronization - moved `WineSync` and `WineHUD` to separate files --- assets/ui/preferences_enhanced.blp | 2 +- src/lib/{config.rs => config/mod.rs} | 67 ++++------------------------ src/lib/config/wine_hud.rs | 37 +++++++++++++++ src/lib/config/wine_sync.rs | 63 ++++++++++++++++++++++++++ src/lib/game.rs | 2 +- src/ui/preferences/enhanced_page.rs | 45 ++++++++++++++++++- 6 files changed, 154 insertions(+), 62 deletions(-) rename src/lib/{config.rs => config/mod.rs} (77%) create mode 100644 src/lib/config/wine_hud.rs create mode 100644 src/lib/config/wine_sync.rs diff --git a/assets/ui/preferences_enhanced.blp b/assets/ui/preferences_enhanced.blp index 2bc2fd7..45be20b 100644 --- a/assets/ui/preferences_enhanced.blp +++ b/assets/ui/preferences_enhanced.blp @@ -46,7 +46,7 @@ Adw.PreferencesPage enhanced_page { ] }; - Gtk.Switch { + Gtk.Switch fsr_switcher { valign: center; } } diff --git a/src/lib/config.rs b/src/lib/config/mod.rs similarity index 77% rename from src/lib/config.rs rename to src/lib/config/mod.rs index b144459..da6eb8c 100644 --- a/src/lib/config.rs +++ b/src/lib/config/mod.rs @@ -7,6 +7,12 @@ use serde::{Serialize, Deserialize}; use super::consts::*; +mod wine_hud; +mod wine_sync; + +pub use wine_hud::WineHUD; +pub use wine_sync::WineSync; + pub fn get() -> Result { match config_file() { Some(path) => { @@ -52,42 +58,6 @@ pub fn update(config: Config) -> Result<(), Error> { } } -#[derive(Debug, Clone, Copy, Serialize, Deserialize)] -pub enum WineHUD { - None, - DXVK, - MangoHUD -} - -impl Default for WineHUD { - fn default() -> Self { - Self::None - } -} - -impl TryFrom for WineHUD { - type Error = String; - - fn try_from(value: u32) -> Result { - match value { - 0 => Ok(Self::None), - 1 => Ok(Self::DXVK), - 2 => Ok(Self::MangoHUD), - _ => Err(String::from("Failed to convert number to HUD enum")) - } - } -} - -impl Into for WineHUD { - fn into(self) -> u32 { - match self { - WineHUD::None => 0, - WineHUD::DXVK => 1, - WineHUD::MangoHUD => 2 - } - } -} - #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct Config { pub launcher: Launcher, @@ -120,25 +90,6 @@ impl Config { None => None } } - - /// Get environment variables corresponding to used wine sync - pub fn get_wine_sync_env_vars(&self) -> HashMap<&str, &str> { - match self.game.wine.sync.as_str() { - "esync" => HashMap::from([ - ("WINEESYNC", "1") - ]), - "fsync" => HashMap::from([ - ("WINEESYNC", "1"), - ("WINEFSYNC", "1") - ]), - "futex2" => HashMap::from([ - ("WINEESYNC", "1"), - ("WINEFSYNC", "1"), - ("WINEFSYNC_FUTEX2", "1") - ]), - _ => HashMap::new() - } - } } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -203,7 +154,7 @@ pub struct Wine { pub prefix: String, pub builds: String, pub selected: Option, - pub sync: String + pub sync: WineSync } impl Default for Wine { @@ -218,7 +169,7 @@ impl Default for Wine { None => String::new() }, selected: None, - sync: String::from("esync") + sync: WineSync::default() } } } @@ -232,7 +183,7 @@ pub struct Enhancements { #[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub struct Fsr { - pub strength: u8, + pub strength: u32, pub enabled: bool } diff --git a/src/lib/config/wine_hud.rs b/src/lib/config/wine_hud.rs new file mode 100644 index 0000000..fa058cb --- /dev/null +++ b/src/lib/config/wine_hud.rs @@ -0,0 +1,37 @@ +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +pub enum WineHUD { + None, + DXVK, + MangoHUD +} + +impl Default for WineHUD { + fn default() -> Self { + Self::None + } +} + +impl TryFrom for WineHUD { + type Error = String; + + fn try_from(value: u32) -> Result { + match value { + 0 => Ok(Self::None), + 1 => Ok(Self::DXVK), + 2 => Ok(Self::MangoHUD), + _ => Err(String::from("Failed to convert number to WineHUD enum")) + } + } +} + +impl Into for WineHUD { + fn into(self) -> u32 { + match self { + Self::None => 0, + Self::DXVK => 1, + Self::MangoHUD => 2 + } + } +} diff --git a/src/lib/config/wine_sync.rs b/src/lib/config/wine_sync.rs new file mode 100644 index 0000000..458fd09 --- /dev/null +++ b/src/lib/config/wine_sync.rs @@ -0,0 +1,63 @@ +use std::collections::HashMap; + +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +pub enum WineSync { + None, + ESync, + FSync, + Futex2 +} + +impl Default for WineSync { + fn default() -> Self { + Self::ESync + } +} + +impl TryFrom for WineSync { + type Error = String; + + fn try_from(value: u32) -> Result { + match value { + 0 => Ok(Self::None), + 1 => Ok(Self::ESync), + 2 => Ok(Self::FSync), + 3 => Ok(Self::Futex2), + _ => Err(String::from("Failed to convert number to WineSync enum")) + } + } +} + +impl Into for WineSync { + fn into(self) -> u32 { + match self { + Self::None => 0, + Self::ESync => 1, + Self::FSync => 2, + Self::Futex2 => 3 + } + } +} + +impl WineSync { + /// Get environment variables corresponding to used wine sync + pub fn get_env_vars(&self) -> HashMap<&str, &str> { + match self { + Self::None => HashMap::new(), + Self::ESync => HashMap::from([ + ("WINEESYNC", "1") + ]), + Self::FSync => HashMap::from([ + ("WINEESYNC", "1"), + ("WINEFSYNC", "1") + ]), + Self::Futex2 => HashMap::from([ + ("WINEESYNC", "1"), + ("WINEFSYNC", "1"), + ("WINEFSYNC_FUTEX2", "1") + ]) + } + } +} diff --git a/src/lib/game.rs b/src/lib/game.rs index 3992404..8356f15 100644 --- a/src/lib/game.rs +++ b/src/lib/game.rs @@ -96,7 +96,7 @@ pub fn run(debug: bool) -> Result<(), Error> { } command.env("WINEPREFIX", &config.game.wine.prefix); - command.envs(config.get_wine_sync_env_vars()); + command.envs(config.game.wine.sync.get_env_vars()); command.envs(config.game.environment) .current_dir(config.game.path) diff --git a/src/ui/preferences/enhanced_page.rs b/src/ui/preferences/enhanced_page.rs index 2625866..24fb7fa 100644 --- a/src/ui/preferences/enhanced_page.rs +++ b/src/ui/preferences/enhanced_page.rs @@ -12,7 +12,8 @@ pub struct Page { pub hud_combo: adw::ComboRow, pub sync_combo: adw::ComboRow, - pub fsr_combo: adw::ComboRow + pub fsr_combo: adw::ComboRow, + pub fsr_switcher: gtk::Switch } impl Page { @@ -24,7 +25,8 @@ impl Page { hud_combo: get_object(&builder, "hud_combo")?, sync_combo: get_object(&builder, "sync_combo")?, - fsr_combo: get_object(&builder, "fsr_combo")? + fsr_combo: get_object(&builder, "fsr_combo")?, + fsr_switcher: get_object(&builder, "fsr_switcher")? }; // Wine HUD selection @@ -37,6 +39,36 @@ impl Page { } }); + // Wine sync selection + result.sync_combo.connect_selected_notify(|hud| { + if let Ok(mut config) = config::get() { + // TODO: show toast + config.game.wine.sync = config::WineSync::try_from(hud.selected()).unwrap(); + + config::update(config).unwrap(); + } + }); + + // FSR strength selection + result.fsr_combo.connect_selected_notify(|hud| { + if let Ok(mut config) = config::get() { + // TODO: show toast + config.game.enhancements.fsr.strength = hud.selected(); + + config::update(config).unwrap(); + } + }); + + // FSR switcher changing + result.fsr_switcher.connect_state_notify(|switcher| { + if let Ok(mut config) = config::get() { + // TODO: show toast + config.game.enhancements.fsr.enabled = switcher.state(); + + config::update(config).unwrap(); + } + }); + Ok(result) } @@ -51,6 +83,15 @@ impl Page { // Update Wine HUD self.hud_combo.set_selected(config.game.enhancements.hud.into()); + // Update Wine sync + self.sync_combo.set_selected(config.game.wine.sync.into()); + + // FSR strength selection + self.fsr_combo.set_selected(config.game.enhancements.fsr.strength); + + // FSR switcher changing + self.fsr_switcher.set_state(config.game.enhancements.fsr.enabled); + Ok(()) } }