mirror of
https://github.com/an-anime-team/sleepy-launcher.git
synced 2025-03-15 06:28:27 +03:00
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()
|
||||
}
|
||||
|
||||
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")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue