From e4e63a8a0dcb158c1aea411da902aad37b9e4d19 Mon Sep 17 00:00:00 2001 From: weter11 Date: Sun, 21 Jun 2026 18:10:29 -0200 Subject: [PATCH] Add Wine control panel settings action --- src/launch/mod.rs | 33 +++++++++++++++++++++++++++++++++ src/ui.rs | 23 +++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/src/launch/mod.rs b/src/launch/mod.rs index 1c0d8f7..ecc64de 100644 --- a/src/launch/mod.rs +++ b/src/launch/mod.rs @@ -80,6 +80,39 @@ pub async fn install_master_steam(config: &LauncherConfig) -> Result<()> { Ok(()) } +pub fn launch_wine_control_panel(config: &LauncherConfig) -> Result<()> { + let library_root = PathBuf::from(&config.steam_library_path); + let resolved_runner = crate::utils::resolve_runner(&config.proton_version, &library_root); + let mut cmd = build_runner_command(&resolved_runner)?; + let steam_cfg = crate::utils::get_master_steam_config(); + + std::fs::create_dir_all(&steam_cfg.wine_prefix) + .with_context(|| format!("failed creating Wine prefix {}", steam_cfg.wine_prefix.display()))?; + + cmd.arg("control.exe"); + cmd.env("WINEPREFIX", &steam_cfg.wine_prefix); + cmd.env("STEAM_COMPAT_DATA_PATH", &steam_cfg.root_dir); + + if let Ok(display) = std::env::var("DISPLAY") { + cmd.env("DISPLAY", display); + } + if let Ok(wayland) = std::env::var("WAYLAND_DISPLAY") { + cmd.env("WAYLAND_DISPLAY", wayland); + } + if let Ok(xdg_runtime) = std::env::var("XDG_RUNTIME_DIR") { + cmd.env("XDG_RUNTIME_DIR", xdg_runtime); + } + + tracing::info!( + runner = %resolved_runner.display(), + wineprefix = %steam_cfg.wine_prefix.display(), + "Launching Wine Control Panel" + ); + + cmd.spawn().context("Failed to spawn Wine Control Panel")?; + Ok(()) +} + async fn download_steam_setup(path: &Path) -> Result<()> { tracing::info!("Downloading SteamSetup.exe..."); let url = "https://cdn.akamai.steamstatic.com/client/installer/SteamSetup.exe"; diff --git a/src/ui.rs b/src/ui.rs index db3423b..7239056 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -122,6 +122,7 @@ pub enum AsyncOp { AuthFailed(String), UserProfileFetched(crate::models::UserProfile), SettingsSaved(bool), + WineControlPanelLaunched, ScanCompleted(u32, HashMap), MetadataFetched(u32, crate::steam_client::AppMetadata), UserConfigsFetched(crate::models::UserConfigStore), @@ -590,6 +591,9 @@ impl SteamLauncher { "Failed to save settings".to_string() }; } + AsyncOp::WineControlPanelLaunched => { + self.status = "Wine Control Panel launched".to_string(); + } AsyncOp::ScanCompleted(appid, installed_paths) => { for g in &mut self.library { if g.app_id == appid { @@ -2782,6 +2786,25 @@ impl eframe::App for SteamLauncher { }); } + ui.add_space(8.0); + ui.separator(); + ui.heading("Wine Tools"); + if ui.button("Open Wine Control Panel").clicked() { + let config = self.launcher_config.clone(); + let tx = self.operation_tx.clone(); + self.runtime.spawn(async move { + match crate::launch::launch_wine_control_panel(&config) { + Ok(()) => { + let _ = tx.send(AsyncOp::WineControlPanelLaunched); + } + Err(e) => { + let _ = tx.send(AsyncOp::Error(format!("Wine Control Panel failed: {e}"))); + } + } + }); + } + ui.label("Launches Wine's control.exe using the default Proton version and SteamFlow's master Wine prefix."); + ui.add_space(8.0); ui.separator(); ui.collapsing("Proton/Wine Manager", |ui| {