Added theoretical support for system wine during initial setup
(can't really check its work now; looks ok so...)
This commit is contained in:
parent
368710fd9d
commit
d8a48caf97
4 changed files with 73 additions and 58 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit e1ad703e01dd77dbe107150a93cdb9934b2b286d
|
Subproject commit 59f7158df2b9a339fd62d4ee124f0ece47751e6b
|
|
@ -19,16 +19,10 @@ impl WinePrefix {
|
||||||
Path::new(&format!("{}/drive_c", path.to_string())).exists()
|
Path::new(&format!("{}/drive_c", path.to_string())).exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn wine<T: ToString>(&self, runners_folder: T, runner: super::wine::Version, command: &str) -> std::io::Result<Output> {
|
fn wine<T: ToString>(&self, wine_binary: T, command: &str) -> std::io::Result<Output> {
|
||||||
let runners_folder = runners_folder.to_string();
|
let mut wine_command = Command::new(wine_binary.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);
|
|
||||||
|
|
||||||
wine_command.env("WINEARCH", "win64")
|
wine_command.env("WINEARCH", "win64")
|
||||||
.env("WINESERVER", wineserver)
|
|
||||||
.env("WINEPREFIX", &self.path)
|
.env("WINEPREFIX", &self.path)
|
||||||
.arg(command);
|
.arg(command);
|
||||||
|
|
||||||
|
@ -36,22 +30,10 @@ impl WinePrefix {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update<T: ToString>(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result<Output> {
|
pub fn update<T: ToString>(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result<Output> {
|
||||||
self.wine(runners_folder, runner, "-u")
|
self.update_with(format!("{}/{}/{}", runners_folder.to_string(), runner.name, runner.files.wine64))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn end<T: ToString>(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result<Output> {
|
pub fn update_with<T: ToString>(&self, wine_binary: T) -> std::io::Result<Output> {
|
||||||
self.wine(runners_folder, runner, "-e")
|
self.wine(wine_binary, "-u")
|
||||||
}
|
|
||||||
|
|
||||||
pub fn kill<T: ToString>(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result<Output> {
|
|
||||||
self.wine(runners_folder, runner, "-k")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn restart<T: ToString>(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result<Output> {
|
|
||||||
self.wine(runners_folder, runner, "-r")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn shutdown<T: ToString>(&self, runners_folder: T, runner: super::wine::Version) -> std::io::Result<Output> {
|
|
||||||
self.wine(runners_folder, runner, "-s")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,9 @@ pub struct Page {
|
||||||
pub progress_bar: ProgressBar,
|
pub progress_bar: ProgressBar,
|
||||||
|
|
||||||
pub wine_versions: Vec<WineVersion>,
|
pub wine_versions: Vec<WineVersion>,
|
||||||
pub dxvk_versions: Vec<DxvkVersion>
|
pub dxvk_versions: Vec<DxvkVersion>,
|
||||||
|
|
||||||
|
system_wine_available: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Page {
|
impl Page {
|
||||||
|
@ -43,12 +45,18 @@ impl Page {
|
||||||
),
|
),
|
||||||
|
|
||||||
wine_versions: Vec::new(),
|
wine_versions: Vec::new(),
|
||||||
dxvk_versions: Vec::new()
|
dxvk_versions: Vec::new(),
|
||||||
|
|
||||||
|
system_wine_available: crate::lib::is_available("wine64")
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add wine versions
|
// Add wine versions
|
||||||
let model = gtk::StringList::new(&[]);
|
let model = gtk::StringList::new(&[]);
|
||||||
|
|
||||||
|
if result.system_wine_available {
|
||||||
|
model.append("System");
|
||||||
|
}
|
||||||
|
|
||||||
for version in &WineList::get()[0].versions {
|
for version in &WineList::get()[0].versions {
|
||||||
if version.recommended {
|
if version.recommended {
|
||||||
model.append(&version.title);
|
model.append(&version.title);
|
||||||
|
@ -59,6 +67,12 @@ impl Page {
|
||||||
|
|
||||||
result.wine_version.set_model(Some(&model));
|
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
|
// Add DXVK versions
|
||||||
let model = gtk::StringList::new(&[]);
|
let model = gtk::StringList::new(&[]);
|
||||||
|
|
||||||
|
@ -75,8 +89,20 @@ impl Page {
|
||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_wine_version(&self) -> &WineVersion {
|
/// Get selected wine version
|
||||||
&self.wine_versions[self.wine_version.selected() as usize]
|
///
|
||||||
|
/// `None` means `System`
|
||||||
|
pub fn get_wine_version(&self) -> Option<WineVersion> {
|
||||||
|
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 {
|
pub fn get_dxvk_version(&self) -> &DxvkVersion {
|
||||||
|
|
|
@ -250,10 +250,11 @@ impl App {
|
||||||
let wine_version = this.widgets.download_components.get_wine_version().clone();
|
let wine_version = this.widgets.download_components.get_wine_version().clone();
|
||||||
let dxvk_version = this.widgets.download_components.get_dxvk_version().clone();
|
let dxvk_version = this.widgets.download_components.get_dxvk_version().clone();
|
||||||
|
|
||||||
|
// Prepare wine downloader
|
||||||
|
if let Some(wine_version) = &wine_version {
|
||||||
let wine_version_copy = wine_version.clone();
|
let wine_version_copy = wine_version.clone();
|
||||||
let this_copy = this.clone();
|
let this_copy = this.clone();
|
||||||
|
|
||||||
// Prepare wine downloader
|
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
let config = config::get().unwrap();
|
let config = config::get().unwrap();
|
||||||
|
|
||||||
|
@ -280,6 +281,11 @@ impl App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
sender_wine.send(InstallerUpdate::UnpackingFinished).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
// Display wine downloading progress
|
// Display wine downloading progress
|
||||||
let progress_bar_copy = progress_bar.clone();
|
let progress_bar_copy = progress_bar.clone();
|
||||||
|
@ -300,18 +306,19 @@ impl App {
|
||||||
let prefix = WinePrefix::new(&config.game.wine.prefix);
|
let prefix = WinePrefix::new(&config.game.wine.prefix);
|
||||||
|
|
||||||
// Update wine config
|
// Update wine config
|
||||||
|
if let Some(wine_version) = &wine_version {
|
||||||
config.game.wine.selected = Some(wine_version.name.clone());
|
config.game.wine.selected = Some(wine_version.name.clone());
|
||||||
|
|
||||||
config::update_raw(config.clone()).unwrap();
|
config::update_raw(config.clone()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
// Create wine prefix
|
// Create wine prefix
|
||||||
let this = this_copy.clone();
|
let this = this_copy.clone();
|
||||||
let wine_version = wine_version.clone();
|
|
||||||
let dxvk_version = dxvk_version_copy.clone();
|
let dxvk_version = dxvk_version_copy.clone();
|
||||||
let sender_dxvk = sender_dxvk.clone();
|
let sender_dxvk = sender_dxvk.clone();
|
||||||
|
|
||||||
std::thread::spawn(move || {
|
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) => {
|
Ok(output) => {
|
||||||
println!("Wine prefix created:\n\n{}", String::from_utf8_lossy(&output.stdout));
|
println!("Wine prefix created:\n\n{}", String::from_utf8_lossy(&output.stdout));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue