Added theoretical support for system wine during initial setup

(can't really check its work now; looks ok so...)
This commit is contained in:
Observer KRypt0n_ 2022-09-14 12:43:33 +02:00
parent 368710fd9d
commit d8a48caf97
No known key found for this signature in database
GPG key ID: 844DA47BA25FE1E2
4 changed files with 73 additions and 58 deletions

@ -1 +1 @@
Subproject commit e1ad703e01dd77dbe107150a93cdb9934b2b286d
Subproject commit 59f7158df2b9a339fd62d4ee124f0ece47751e6b

View file

@ -19,16 +19,10 @@ impl WinePrefix {
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> {
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<T: ToString>(&self, wine_binary: T, command: &str) -> std::io::Result<Output> {
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<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> {
self.wine(runners_folder, runner, "-e")
}
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")
pub fn update_with<T: ToString>(&self, wine_binary: T) -> std::io::Result<Output> {
self.wine(wine_binary, "-u")
}
}

View file

@ -20,7 +20,9 @@ pub struct Page {
pub progress_bar: ProgressBar,
pub wine_versions: Vec<WineVersion>,
pub dxvk_versions: Vec<DxvkVersion>
pub dxvk_versions: Vec<DxvkVersion>,
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<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 {

View file

@ -250,10 +250,11 @@ impl App {
let wine_version = this.widgets.download_components.get_wine_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 this_copy = this.clone();
// Prepare wine downloader
std::thread::spawn(move || {
let config = config::get().unwrap();
@ -280,6 +281,11 @@ impl App {
}
}
});
}
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
if let Some(wine_version) = &wine_version {
config.game.wine.selected = Some(wine_version.name.clone());
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));