From 70b0dee1635dbab53d78e49827262389a81d2e59 Mon Sep 17 00:00:00 2001 From: weter11 Date: Fri, 13 Feb 2026 19:11:45 +0200 Subject: [PATCH 1/3] Fix installed game detection and install path refresh --- SteamFlow/src/config.rs | 10 ++++++++-- SteamFlow/src/library.rs | 9 ++++----- SteamFlow/src/ui.rs | 13 +++++++------ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/SteamFlow/src/config.rs b/SteamFlow/src/config.rs index c0bca8a7..cf6e8730 100644 --- a/SteamFlow/src/config.rs +++ b/SteamFlow/src/config.rs @@ -26,9 +26,15 @@ impl LauncherConfig { impl Default for LauncherConfig { fn default() -> Self { - let home = std::env::var("HOME").unwrap_or_else(|_| "~".to_string()); + let steam_library_path = detect_steam_path() + .map(|path| path.to_string_lossy().to_string()) + .unwrap_or_else(|| { + let home = std::env::var("HOME").unwrap_or_else(|_| "~".to_string()); + format!("{home}/Games/SteamFlow") + }); + Self { - steam_library_path: format!("{home}/Games/SteamFlow"), + steam_library_path, proton_version: "experimental".to_string(), enable_cloud_sync: true, use_shared_compat_data: false, diff --git a/SteamFlow/src/library.rs b/SteamFlow/src/library.rs index 98c12856..cd077df5 100644 --- a/SteamFlow/src/library.rs +++ b/SteamFlow/src/library.rs @@ -64,19 +64,18 @@ pub async fn scan_installed_app_paths() -> Result> { } pub async fn scan_installed_app_paths_pathbuf() -> Result> { - let config_path = if let Ok(cfg) = load_launcher_config().await { + let config_path = load_launcher_config().await.ok().and_then(|cfg| { let p = PathBuf::from(cfg.steam_library_path); if p.join("steamapps").exists() || p.join("Steam").join("steamapps").exists() { Some(p) } else { None } - } else { - None - }; + }); let root = config_path - .unwrap_or_else(|| detect_steam_path().unwrap_or_else(|| PathBuf::from("~/.steam/steam"))); + .or_else(detect_steam_path) + .unwrap_or_else(default_steam_root); println!("Scanning Library Root: {:?}", root); scan_library(&root).await } diff --git a/SteamFlow/src/ui.rs b/SteamFlow/src/ui.rs index 008103d9..1bb1f0d7 100644 --- a/SteamFlow/src/ui.rs +++ b/SteamFlow/src/ui.rs @@ -235,14 +235,15 @@ impl SteamLauncher { DownloadProgressState::Completed => { self.status = "Install completed".to_string(); if let Some(appid) = self.active_download_appid { + let installed_paths = self + .runtime + .block_on(scan_installed_app_paths()) + .unwrap_or_default(); + for g in &mut self.library { if g.app_id == appid { - g.is_installed = true; - let install_dir = std::env::temp_dir() - .join("steamflow_downloads") - .join(appid.to_string()); - g.install_path = - Some(install_dir.to_string_lossy().to_string()); + g.install_path = installed_paths.get(&appid).cloned(); + g.is_installed = g.install_path.is_some(); } } } From f6aefff72114ca49cebaaf10e5125a80954bad05 Mon Sep 17 00:00:00 2001 From: weter11 Date: Fri, 13 Feb 2026 20:32:29 +0200 Subject: [PATCH 2/3] Make library scan resilient to bad VDF and manifests --- SteamFlow/src/library.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/SteamFlow/src/library.rs b/SteamFlow/src/library.rs index cd077df5..01565f56 100644 --- a/SteamFlow/src/library.rs +++ b/SteamFlow/src/library.rs @@ -85,7 +85,12 @@ pub async fn scan_library(root_path: &Path) -> Result> { let mut libraries = vec![root_path.to_path_buf()]; let library_folders_path = root_path.join("steamapps").join("libraryfolders.vdf"); - let extra_libraries = parse_library_folders(library_folders_path).await?; + let extra_libraries = parse_library_folders(library_folders_path) + .await + .unwrap_or_else(|e| { + println!("Warning: Could not parse libraryfolders.vdf: {}", e); + Vec::new() + }); libraries.extend(extra_libraries); libraries.sort(); @@ -107,8 +112,12 @@ pub async fn scan_library(root_path: &Path) -> Result> { continue; } - if let Some((app_id, install_dir)) = parse_app_manifest_install_path(&path).await? { - installed.insert(app_id, install_dir); + match parse_app_manifest_install_path(&path).await { + Ok(Some((app_id, install_dir))) => { + installed.insert(app_id, install_dir); + } + Ok(None) => {} + Err(e) => println!("Skipping bad manifest {:?}: {}", path, e), } } } From e09b147681f09d90182e0601c90e9a83ccab3c6e Mon Sep 17 00:00:00 2001 From: weter11 Date: Fri, 13 Feb 2026 22:34:31 +0200 Subject: [PATCH 3/3] Reorganize repo: move Rust app to root and legacy C# into OpenSteamClient --- .github/workflows/rust.yaml | 11 +++++++---- SteamFlow/COMPARISON.md => COMPARISON.md | 0 SteamFlow/Cargo.lock => Cargo.lock | 0 SteamFlow/Cargo.toml => Cargo.toml | 0 .../Directory.Build.props | 0 .../OpenSteamClient.sln | 0 .../OpenSteamClient.sln.DotSettings.user | 0 {tools => OpenSteamClient/tools}/.gitignore | 0 {tools => OpenSteamClient/tools}/binaryvdfparser | 0 .../tools}/binaryvdfparser_src/Program.cs | 0 .../tools}/binaryvdfparser_src/binaryvdfparser.csproj | 0 {tools => OpenSteamClient/tools}/callbackdumper | 0 .../tools}/callbackdumper_src/Program.cs | 0 .../tools}/callbackdumper_src/callbackdumper.csproj | 0 .../tools}/createCallbackMapFromJson.js | 0 .../tools}/createCallbackRelatedMapsFromJson.js | 0 .../tools}/createCallbackStructFromJson.js | 0 .../tools}/createEnumFromJson.js | 0 {tools => OpenSteamClient/tools}/ipctool | 0 .../tools}/ipctool_src/BinaryReaderExtensions.cs | 0 .../tools}/ipctool_src/EndianAwareBinaryReader.cs | 0 .../tools}/ipctool_src/EndianAwareBinaryWriter.cs | 0 .../tools}/ipctool_src/IPCClient.cs | 0 .../tools}/ipctool_src/InterfaceMap.cs | 0 .../tools}/ipctool_src/Program.cs | 0 .../tools}/ipctool_src/ipctool.csproj | 0 {tools => OpenSteamClient/tools}/protobuftester | 0 .../tools}/protobuftester_src/Program.cs | 0 .../tools}/protobuftester_src/README.md | 0 .../tools}/protobuftester_src/protobuftester.csproj | 0 README.md | 2 +- SteamFlow/ROADMAP.md => ROADMAP.md | 0 SteamFlow/README.md => STEAMFLOW_TECHNICAL.md | 2 +- {SteamFlow/assets => assets}/opensteam-logo.svg | 0 {SteamFlow/src => src}/cloud_sync.rs | 0 {SteamFlow/src => src}/cm_list.rs | 0 {SteamFlow/src => src}/config.rs | 0 {SteamFlow/src => src}/depot_browser.rs | 0 {SteamFlow/src => src}/download_pipeline.rs | 0 {SteamFlow/src => src}/install.rs | 0 {SteamFlow/src => src}/lib.rs | 0 {SteamFlow/src => src}/library.rs | 0 {SteamFlow/src => src}/main.rs | 0 {SteamFlow/src => src}/models.rs | 0 {SteamFlow/src => src}/steam_client.rs | 0 {SteamFlow/src => src}/ui.rs | 0 46 files changed, 9 insertions(+), 6 deletions(-) rename SteamFlow/COMPARISON.md => COMPARISON.md (100%) rename SteamFlow/Cargo.lock => Cargo.lock (100%) rename SteamFlow/Cargo.toml => Cargo.toml (100%) rename Directory.Build.props => OpenSteamClient/Directory.Build.props (100%) rename OpenSteamClient.sln => OpenSteamClient/OpenSteamClient.sln (100%) rename OpenSteamClient.sln.DotSettings.user => OpenSteamClient/OpenSteamClient.sln.DotSettings.user (100%) rename {tools => OpenSteamClient/tools}/.gitignore (100%) rename {tools => OpenSteamClient/tools}/binaryvdfparser (100%) mode change 100755 => 100644 rename {tools => OpenSteamClient/tools}/binaryvdfparser_src/Program.cs (100%) rename {tools => OpenSteamClient/tools}/binaryvdfparser_src/binaryvdfparser.csproj (100%) rename {tools => OpenSteamClient/tools}/callbackdumper (100%) mode change 100755 => 100644 rename {tools => OpenSteamClient/tools}/callbackdumper_src/Program.cs (100%) rename {tools => OpenSteamClient/tools}/callbackdumper_src/callbackdumper.csproj (100%) rename {tools => OpenSteamClient/tools}/createCallbackMapFromJson.js (100%) rename {tools => OpenSteamClient/tools}/createCallbackRelatedMapsFromJson.js (100%) rename {tools => OpenSteamClient/tools}/createCallbackStructFromJson.js (100%) rename {tools => OpenSteamClient/tools}/createEnumFromJson.js (100%) rename {tools => OpenSteamClient/tools}/ipctool (100%) mode change 100755 => 100644 rename {tools => OpenSteamClient/tools}/ipctool_src/BinaryReaderExtensions.cs (100%) rename {tools => OpenSteamClient/tools}/ipctool_src/EndianAwareBinaryReader.cs (100%) rename {tools => OpenSteamClient/tools}/ipctool_src/EndianAwareBinaryWriter.cs (100%) rename {tools => OpenSteamClient/tools}/ipctool_src/IPCClient.cs (100%) rename {tools => OpenSteamClient/tools}/ipctool_src/InterfaceMap.cs (100%) rename {tools => OpenSteamClient/tools}/ipctool_src/Program.cs (100%) rename {tools => OpenSteamClient/tools}/ipctool_src/ipctool.csproj (100%) rename {tools => OpenSteamClient/tools}/protobuftester (100%) mode change 100755 => 100644 rename {tools => OpenSteamClient/tools}/protobuftester_src/Program.cs (100%) rename {tools => OpenSteamClient/tools}/protobuftester_src/README.md (100%) rename {tools => OpenSteamClient/tools}/protobuftester_src/protobuftester.csproj (100%) rename SteamFlow/ROADMAP.md => ROADMAP.md (100%) rename SteamFlow/README.md => STEAMFLOW_TECHNICAL.md (98%) rename {SteamFlow/assets => assets}/opensteam-logo.svg (100%) rename {SteamFlow/src => src}/cloud_sync.rs (100%) rename {SteamFlow/src => src}/cm_list.rs (100%) rename {SteamFlow/src => src}/config.rs (100%) rename {SteamFlow/src => src}/depot_browser.rs (100%) rename {SteamFlow/src => src}/download_pipeline.rs (100%) rename {SteamFlow/src => src}/install.rs (100%) rename {SteamFlow/src => src}/lib.rs (100%) rename {SteamFlow/src => src}/library.rs (100%) rename {SteamFlow/src => src}/main.rs (100%) rename {SteamFlow/src => src}/models.rs (100%) rename {SteamFlow/src => src}/steam_client.rs (100%) rename {SteamFlow/src => src}/ui.rs (100%) diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index 9f7046e3..00ae94f8 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -3,7 +3,10 @@ name: SteamFlow Rust Build on: push: paths: - - "SteamFlow/**" + - "src/**" + - "assets/**" + - "Cargo.toml" + - "Cargo.lock" - ".github/workflows/rust.yaml" pull_request: @@ -40,16 +43,16 @@ jobs: uses: dtolnay/rust-toolchain@stable - name: Build SteamFlow (release) - run: cargo build --release --manifest-path SteamFlow/Cargo.toml + run: cargo build --release - name: Install cargo-deb run: cargo install cargo-deb --locked - name: Build .deb package - run: cargo deb --no-build --manifest-path SteamFlow/Cargo.toml + run: cargo deb --no-build - name: Upload .deb artifact uses: actions/upload-artifact@v4 with: name: steamflow-deb - path: SteamFlow/target/debian/*.deb + path: target/debian/*.deb diff --git a/SteamFlow/COMPARISON.md b/COMPARISON.md similarity index 100% rename from SteamFlow/COMPARISON.md rename to COMPARISON.md diff --git a/SteamFlow/Cargo.lock b/Cargo.lock similarity index 100% rename from SteamFlow/Cargo.lock rename to Cargo.lock diff --git a/SteamFlow/Cargo.toml b/Cargo.toml similarity index 100% rename from SteamFlow/Cargo.toml rename to Cargo.toml diff --git a/Directory.Build.props b/OpenSteamClient/Directory.Build.props similarity index 100% rename from Directory.Build.props rename to OpenSteamClient/Directory.Build.props diff --git a/OpenSteamClient.sln b/OpenSteamClient/OpenSteamClient.sln similarity index 100% rename from OpenSteamClient.sln rename to OpenSteamClient/OpenSteamClient.sln diff --git a/OpenSteamClient.sln.DotSettings.user b/OpenSteamClient/OpenSteamClient.sln.DotSettings.user similarity index 100% rename from OpenSteamClient.sln.DotSettings.user rename to OpenSteamClient/OpenSteamClient.sln.DotSettings.user diff --git a/tools/.gitignore b/OpenSteamClient/tools/.gitignore similarity index 100% rename from tools/.gitignore rename to OpenSteamClient/tools/.gitignore diff --git a/tools/binaryvdfparser b/OpenSteamClient/tools/binaryvdfparser old mode 100755 new mode 100644 similarity index 100% rename from tools/binaryvdfparser rename to OpenSteamClient/tools/binaryvdfparser diff --git a/tools/binaryvdfparser_src/Program.cs b/OpenSteamClient/tools/binaryvdfparser_src/Program.cs similarity index 100% rename from tools/binaryvdfparser_src/Program.cs rename to OpenSteamClient/tools/binaryvdfparser_src/Program.cs diff --git a/tools/binaryvdfparser_src/binaryvdfparser.csproj b/OpenSteamClient/tools/binaryvdfparser_src/binaryvdfparser.csproj similarity index 100% rename from tools/binaryvdfparser_src/binaryvdfparser.csproj rename to OpenSteamClient/tools/binaryvdfparser_src/binaryvdfparser.csproj diff --git a/tools/callbackdumper b/OpenSteamClient/tools/callbackdumper old mode 100755 new mode 100644 similarity index 100% rename from tools/callbackdumper rename to OpenSteamClient/tools/callbackdumper diff --git a/tools/callbackdumper_src/Program.cs b/OpenSteamClient/tools/callbackdumper_src/Program.cs similarity index 100% rename from tools/callbackdumper_src/Program.cs rename to OpenSteamClient/tools/callbackdumper_src/Program.cs diff --git a/tools/callbackdumper_src/callbackdumper.csproj b/OpenSteamClient/tools/callbackdumper_src/callbackdumper.csproj similarity index 100% rename from tools/callbackdumper_src/callbackdumper.csproj rename to OpenSteamClient/tools/callbackdumper_src/callbackdumper.csproj diff --git a/tools/createCallbackMapFromJson.js b/OpenSteamClient/tools/createCallbackMapFromJson.js similarity index 100% rename from tools/createCallbackMapFromJson.js rename to OpenSteamClient/tools/createCallbackMapFromJson.js diff --git a/tools/createCallbackRelatedMapsFromJson.js b/OpenSteamClient/tools/createCallbackRelatedMapsFromJson.js similarity index 100% rename from tools/createCallbackRelatedMapsFromJson.js rename to OpenSteamClient/tools/createCallbackRelatedMapsFromJson.js diff --git a/tools/createCallbackStructFromJson.js b/OpenSteamClient/tools/createCallbackStructFromJson.js similarity index 100% rename from tools/createCallbackStructFromJson.js rename to OpenSteamClient/tools/createCallbackStructFromJson.js diff --git a/tools/createEnumFromJson.js b/OpenSteamClient/tools/createEnumFromJson.js similarity index 100% rename from tools/createEnumFromJson.js rename to OpenSteamClient/tools/createEnumFromJson.js diff --git a/tools/ipctool b/OpenSteamClient/tools/ipctool old mode 100755 new mode 100644 similarity index 100% rename from tools/ipctool rename to OpenSteamClient/tools/ipctool diff --git a/tools/ipctool_src/BinaryReaderExtensions.cs b/OpenSteamClient/tools/ipctool_src/BinaryReaderExtensions.cs similarity index 100% rename from tools/ipctool_src/BinaryReaderExtensions.cs rename to OpenSteamClient/tools/ipctool_src/BinaryReaderExtensions.cs diff --git a/tools/ipctool_src/EndianAwareBinaryReader.cs b/OpenSteamClient/tools/ipctool_src/EndianAwareBinaryReader.cs similarity index 100% rename from tools/ipctool_src/EndianAwareBinaryReader.cs rename to OpenSteamClient/tools/ipctool_src/EndianAwareBinaryReader.cs diff --git a/tools/ipctool_src/EndianAwareBinaryWriter.cs b/OpenSteamClient/tools/ipctool_src/EndianAwareBinaryWriter.cs similarity index 100% rename from tools/ipctool_src/EndianAwareBinaryWriter.cs rename to OpenSteamClient/tools/ipctool_src/EndianAwareBinaryWriter.cs diff --git a/tools/ipctool_src/IPCClient.cs b/OpenSteamClient/tools/ipctool_src/IPCClient.cs similarity index 100% rename from tools/ipctool_src/IPCClient.cs rename to OpenSteamClient/tools/ipctool_src/IPCClient.cs diff --git a/tools/ipctool_src/InterfaceMap.cs b/OpenSteamClient/tools/ipctool_src/InterfaceMap.cs similarity index 100% rename from tools/ipctool_src/InterfaceMap.cs rename to OpenSteamClient/tools/ipctool_src/InterfaceMap.cs diff --git a/tools/ipctool_src/Program.cs b/OpenSteamClient/tools/ipctool_src/Program.cs similarity index 100% rename from tools/ipctool_src/Program.cs rename to OpenSteamClient/tools/ipctool_src/Program.cs diff --git a/tools/ipctool_src/ipctool.csproj b/OpenSteamClient/tools/ipctool_src/ipctool.csproj similarity index 100% rename from tools/ipctool_src/ipctool.csproj rename to OpenSteamClient/tools/ipctool_src/ipctool.csproj diff --git a/tools/protobuftester b/OpenSteamClient/tools/protobuftester old mode 100755 new mode 100644 similarity index 100% rename from tools/protobuftester rename to OpenSteamClient/tools/protobuftester diff --git a/tools/protobuftester_src/Program.cs b/OpenSteamClient/tools/protobuftester_src/Program.cs similarity index 100% rename from tools/protobuftester_src/Program.cs rename to OpenSteamClient/tools/protobuftester_src/Program.cs diff --git a/tools/protobuftester_src/README.md b/OpenSteamClient/tools/protobuftester_src/README.md similarity index 100% rename from tools/protobuftester_src/README.md rename to OpenSteamClient/tools/protobuftester_src/README.md diff --git a/tools/protobuftester_src/protobuftester.csproj b/OpenSteamClient/tools/protobuftester_src/protobuftester.csproj similarity index 100% rename from tools/protobuftester_src/protobuftester.csproj rename to OpenSteamClient/tools/protobuftester_src/protobuftester.csproj diff --git a/README.md b/README.md index d517b6f2..52753f8c 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ sudo apt-get install build-essential pkg-config libssl-dev libx11-dev libxi-dev ## Build and Run ```bash git clone https://github.com/OpenSteamClient/OpenSteamClient.git --recursive -cd OpenSteamClient/SteamFlow +cd OpenSteamClient cargo run --release ``` diff --git a/SteamFlow/ROADMAP.md b/ROADMAP.md similarity index 100% rename from SteamFlow/ROADMAP.md rename to ROADMAP.md diff --git a/SteamFlow/README.md b/STEAMFLOW_TECHNICAL.md similarity index 98% rename from SteamFlow/README.md rename to STEAMFLOW_TECHNICAL.md index 44c13502..0213b163 100644 --- a/SteamFlow/README.md +++ b/STEAMFLOW_TECHNICAL.md @@ -48,7 +48,7 @@ Guard data is persisted through `FileGuardDataStore::user_cache()` so repeated S ## Run ```bash -cargo run --manifest-path SteamFlow/Cargo.toml +cargo run ``` ## Install/download pipeline diff --git a/SteamFlow/assets/opensteam-logo.svg b/assets/opensteam-logo.svg similarity index 100% rename from SteamFlow/assets/opensteam-logo.svg rename to assets/opensteam-logo.svg diff --git a/SteamFlow/src/cloud_sync.rs b/src/cloud_sync.rs similarity index 100% rename from SteamFlow/src/cloud_sync.rs rename to src/cloud_sync.rs diff --git a/SteamFlow/src/cm_list.rs b/src/cm_list.rs similarity index 100% rename from SteamFlow/src/cm_list.rs rename to src/cm_list.rs diff --git a/SteamFlow/src/config.rs b/src/config.rs similarity index 100% rename from SteamFlow/src/config.rs rename to src/config.rs diff --git a/SteamFlow/src/depot_browser.rs b/src/depot_browser.rs similarity index 100% rename from SteamFlow/src/depot_browser.rs rename to src/depot_browser.rs diff --git a/SteamFlow/src/download_pipeline.rs b/src/download_pipeline.rs similarity index 100% rename from SteamFlow/src/download_pipeline.rs rename to src/download_pipeline.rs diff --git a/SteamFlow/src/install.rs b/src/install.rs similarity index 100% rename from SteamFlow/src/install.rs rename to src/install.rs diff --git a/SteamFlow/src/lib.rs b/src/lib.rs similarity index 100% rename from SteamFlow/src/lib.rs rename to src/lib.rs diff --git a/SteamFlow/src/library.rs b/src/library.rs similarity index 100% rename from SteamFlow/src/library.rs rename to src/library.rs diff --git a/SteamFlow/src/main.rs b/src/main.rs similarity index 100% rename from SteamFlow/src/main.rs rename to src/main.rs diff --git a/SteamFlow/src/models.rs b/src/models.rs similarity index 100% rename from SteamFlow/src/models.rs rename to src/models.rs diff --git a/SteamFlow/src/steam_client.rs b/src/steam_client.rs similarity index 100% rename from SteamFlow/src/steam_client.rs rename to src/steam_client.rs diff --git a/SteamFlow/src/ui.rs b/src/ui.rs similarity index 100% rename from SteamFlow/src/ui.rs rename to src/ui.rs