diff --git a/components b/components index e1ad703..59f7158 160000 --- a/components +++ b/components @@ -1 +1 @@ -Subproject commit e1ad703e01dd77dbe107150a93cdb9934b2b286d +Subproject commit 59f7158df2b9a339fd62d4ee124f0ece47751e6b diff --git a/src/lib/wine_prefix.rs b/src/lib/wine_prefix.rs index 430f98d..ba5e7d2 100644 --- a/src/lib/wine_prefix.rs +++ b/src/lib/wine_prefix.rs @@ -19,16 +19,10 @@ impl WinePrefix { Path::new(&format!("{}/drive_c", path.to_string())).exists() } - fn wine(&self, runners_folder: T, runner: super::wine::Version, command: &str) -> std::io::Result { - let runners_folder = runners_folder.to_string(); - - let wine = format!("{}/{}/{}", &runners_folder, runner.name, runner.files.wine64); - let wineserver = format!("{}/{}/{}", &runners_folder, runner.name, runner.files.wineserver); - - let mut wine_command = Command::new(wine); + fn wine(&self, wine_binary: T, command: &str) -> std::io::Result { + let mut wine_command = Command::new(wine_binary.to_string()); wine_command.env("WINEARCH", "win64") - .env("WINESERVER", wineserver) .env("WINEPREFIX", &self.path) .arg(command); @@ -36,22 +30,10 @@ impl WinePrefix { } pub fn update(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result { - self.wine(runners_folder, runner, "-u") + self.update_with(format!("{}/{}/{}", runners_folder.to_string(), runner.name, runner.files.wine64)) } - pub fn end(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result { - self.wine(runners_folder, runner, "-e") - } - - pub fn kill(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result { - self.wine(runners_folder, runner, "-k") - } - - pub fn restart(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result { - self.wine(runners_folder, runner, "-r") - } - - pub fn shutdown(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result { - self.wine(runners_folder, runner, "-s") + pub fn update_with(&self, wine_binary: T) -> std::io::Result { + self.wine(wine_binary, "-u") } } diff --git a/src/ui/first_run/download_components.rs b/src/ui/first_run/download_components.rs index a83e4e4..35d55a9 100644 --- a/src/ui/first_run/download_components.rs +++ b/src/ui/first_run/download_components.rs @@ -20,7 +20,9 @@ pub struct Page { pub progress_bar: ProgressBar, pub wine_versions: Vec, - pub dxvk_versions: Vec + pub dxvk_versions: Vec, + + system_wine_available: bool } impl Page { @@ -43,12 +45,18 @@ impl Page { ), wine_versions: Vec::new(), - dxvk_versions: Vec::new() + dxvk_versions: Vec::new(), + + system_wine_available: crate::lib::is_available("wine64") }; // Add wine versions let model = gtk::StringList::new(&[]); + if result.system_wine_available { + model.append("System"); + } + for version in &WineList::get()[0].versions { if version.recommended { model.append(&version.title); @@ -59,6 +67,12 @@ impl Page { result.wine_version.set_model(Some(&model)); + // We're not recommending user to use system wine + // and suggest to download some wine build better for gaming + if result.system_wine_available { + result.wine_version.set_selected(1); + } + // Add DXVK versions let model = gtk::StringList::new(&[]); @@ -75,8 +89,20 @@ impl Page { Ok(result) } - pub fn get_wine_version(&self) -> &WineVersion { - &self.wine_versions[self.wine_version.selected() as usize] + /// Get selected wine version + /// + /// `None` means `System` + pub fn get_wine_version(&self) -> Option { + if self.system_wine_available { + match self.wine_version.selected() { + 0 => None, + i => Some(self.wine_versions[i as usize - 1].clone()) + } + } + + else { + Some(self.wine_versions[self.wine_version.selected() as usize].clone()) + } } pub fn get_dxvk_version(&self) -> &DxvkVersion { diff --git a/src/ui/first_run/mod.rs b/src/ui/first_run/mod.rs index 78619b8..318d409 100644 --- a/src/ui/first_run/mod.rs +++ b/src/ui/first_run/mod.rs @@ -250,36 +250,42 @@ impl App { let wine_version = this.widgets.download_components.get_wine_version().clone(); let dxvk_version = this.widgets.download_components.get_dxvk_version().clone(); - let wine_version_copy = wine_version.clone(); - let this_copy = this.clone(); - // Prepare wine downloader - std::thread::spawn(move || { - let config = config::get().unwrap(); + if let Some(wine_version) = &wine_version { + let wine_version_copy = wine_version.clone(); + let this_copy = this.clone(); - match Installer::new(&wine_version_copy.uri) { - Ok(mut installer) => { - if let Some(temp_folder) = config.launcher.temp { - installer.temp_folder = temp_folder; + std::thread::spawn(move || { + let config = config::get().unwrap(); + + match Installer::new(&wine_version_copy.uri) { + Ok(mut installer) => { + if let Some(temp_folder) = config.launcher.temp { + installer.temp_folder = temp_folder; + } + + installer.downloader + .set_downloading_speed(config.launcher.speed_limit) + .expect("Failed to set downloading speed limit"); + + // Download wine + #[allow(unused_must_use)] + installer.install(&config.game.wine.builds, move |state| { + sender_wine.send(state); + }); + }, + Err(err) => { + this_copy.update(Actions::Toast(Rc::new(( + String::from("Failed to init wine downloader"), err.to_string() + )))).unwrap(); } - - installer.downloader - .set_downloading_speed(config.launcher.speed_limit) - .expect("Failed to set downloading speed limit"); - - // Download wine - #[allow(unused_must_use)] - installer.install(&config.game.wine.builds, move |state| { - sender_wine.send(state); - }); - }, - Err(err) => { - this_copy.update(Actions::Toast(Rc::new(( - String::from("Failed to init wine downloader"), err.to_string() - )))).unwrap(); } - } - }); + }); + } + + else { + sender_wine.send(InstallerUpdate::UnpackingFinished).unwrap(); + } // Display wine downloading progress let progress_bar_copy = progress_bar.clone(); @@ -300,18 +306,19 @@ impl App { let prefix = WinePrefix::new(&config.game.wine.prefix); // Update wine config - config.game.wine.selected = Some(wine_version.name.clone()); + if let Some(wine_version) = &wine_version { + config.game.wine.selected = Some(wine_version.name.clone()); - config::update_raw(config.clone()).unwrap(); + config::update_raw(config.clone()).unwrap(); + } // Create wine prefix let this = this_copy.clone(); - let wine_version = wine_version.clone(); let dxvk_version = dxvk_version_copy.clone(); let sender_dxvk = sender_dxvk.clone(); std::thread::spawn(move || { - match prefix.update(&config.game.wine.builds, wine_version.clone()) { + match prefix.update_with(config.try_get_wine_executable().expect("None of wine builds are available")) { Ok(output) => { println!("Wine prefix created:\n\n{}", String::from_utf8_lossy(&output.stdout));