diff options
| -rw-r--r-- | README.md | 14 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/constants.py | 2 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/plugin.py | 8 | ||||
| -rw-r--r-- | src/components/SmartClipboardButton.tsx | 9 | ||||
| -rw-r--r-- | src/components/UsageInstructions.tsx | 42 |
5 files changed, 68 insertions, 7 deletions
@@ -39,6 +39,20 @@ A Decky plugin that streamlines the installation of **lsfg-vk** ([Lossless Scali - Or use the "Launch Option Clipboard" button in the plugin to copy the command 6. **Launch your game** - frame generation will activate automatically using your plugin configuration +### Armada launch options + +Armada games already use `/usr/libexec/armada/armada-game-launch %command%` +to apply their FEX profile and controller/runtime fixes. Preserve that wrapper by +prepending LSFG to the existing option: + +```bash +~/lsfg /usr/libexec/armada/armada-game-launch %command% +``` + +The plugin detects Armada and copies this combined command automatically. LSFG +sets its environment first, then Armada applies the game's settings and launches +Proton normally. + ## Configuration Options The plugin provides several configuration options to optimize frame generation for your games: diff --git a/py_modules/lsfg_vk/constants.py b/py_modules/lsfg_vk/constants.py index 795c1bf..a2140b3 100644 --- a/py_modules/lsfg_vk/constants.py +++ b/py_modules/lsfg_vk/constants.py @@ -25,6 +25,8 @@ JSON_EXT = ".json" BIN_DIR = "bin" +ARMADA_GAME_LAUNCH = Path("/usr/libexec/armada/armada-game-launch") + STEAM_COMMON_PATH = Path("steamapps/common/Lossless Scaling") LOSSLESS_DLL_NAME = "Lossless.dll" diff --git a/py_modules/lsfg_vk/plugin.py b/py_modules/lsfg_vk/plugin.py index cb59b4f..2cb08f4 100644 --- a/py_modules/lsfg_vk/plugin.py +++ b/py_modules/lsfg_vk/plugin.py @@ -18,6 +18,7 @@ from .dll_detection import DllDetectionService from .configuration import ConfigurationService from .config_schema import ConfigurationManager from .flatpak_service import FlatpakService +from .constants import ARMADA_GAME_LAUNCH class Plugin: @@ -255,6 +256,13 @@ class Plugin: Returns: Dict containing the launch option string and instructions """ + if ARMADA_GAME_LAUNCH.is_file(): + return { + "launch_option": f"~/lsfg {ARMADA_GAME_LAUNCH} %command%", + "instructions": "Use this combined command in Steam Properties, preserving Armada's game-launch wrapper", + "explanation": "LSFG sets its environment first, then Armada applies the game's FEX profile and launches Proton" + } + return { "launch_option": "~/lsfg %command%", "instructions": "Add this to your game's launch options in Steam Properties", diff --git a/src/components/SmartClipboardButton.tsx b/src/components/SmartClipboardButton.tsx index c90515a..7217e83 100644 --- a/src/components/SmartClipboardButton.tsx +++ b/src/components/SmartClipboardButton.tsx @@ -20,12 +20,11 @@ export function SmartClipboardButton() { }, [showSuccess]); const getLaunchOptionText = async (): Promise<string> => { - try { - const result = await getLaunchOption(); - return result.launch_option || "~/lsfg %command%"; - } catch (error) { - return "~/lsfg %command%"; + const result = await getLaunchOption(); + if (!result.launch_option) { + throw new Error("Launch option is unavailable"); } + return result.launch_option; }; const copyToClipboard = async () => { diff --git a/src/components/UsageInstructions.tsx b/src/components/UsageInstructions.tsx index 5f032b8..02d0eb3 100644 --- a/src/components/UsageInstructions.tsx +++ b/src/components/UsageInstructions.tsx @@ -1,6 +1,31 @@ +import { useEffect, useState } from "react"; import { PanelSectionRow } from "@decky/ui"; +import { getLaunchOption } from "../api/lsfgApi"; export function UsageInstructions() { + const [launchOption, setLaunchOption] = useState("~/lsfg %command%"); + const [launchExplanation, setLaunchExplanation] = useState( + "The LSFG wrapper configures frame generation before launching the game." + ); + + useEffect(() => { + let active = true; + + getLaunchOption() + .then((result) => { + if (!active) return; + if (result.launch_option) setLaunchOption(result.launch_option); + if (result.explanation) setLaunchExplanation(result.explanation); + }) + .catch(() => { + // Keep the standard launch option visible if the backend is unavailable. + }); + + return () => { + active = false; + }; + }, []); + return ( <> <PanelSectionRow> @@ -47,7 +72,20 @@ export function UsageInstructions() { textAlign: "center" }} > - <strong>~/lsfg %command%</strong> + <strong>{launchOption}</strong> + </div> + </PanelSectionRow> + + <PanelSectionRow> + <div + style={{ + fontSize: "11px", + lineHeight: "1.3", + opacity: "0.7", + marginTop: "4px" + }} + > + {launchExplanation} </div> </PanelSectionRow> @@ -60,7 +98,7 @@ export function UsageInstructions() { marginTop: "8px" }} > -The configuration is stored in ~/.config/lsfg-vk/conf.toml and hot-reloads while games are running. + The configuration is stored in ~/.config/lsfg-vk/conf.toml and hot-reloads while games are running. </div> </PanelSectionRow> </> |
