From e205effa83dbbcb9c13f3f11a493a525e989d7b6 Mon Sep 17 00:00:00 2001 From: Janleyx <242423638+Janleyx@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:20:20 -0400 Subject: preserve Armada game launch wrapper --- README.md | 14 +++++++++++ py_modules/lsfg_vk/constants.py | 2 ++ py_modules/lsfg_vk/plugin.py | 8 +++++++ src/components/SmartClipboardButton.tsx | 9 ++++--- src/components/UsageInstructions.tsx | 42 +++++++++++++++++++++++++++++++-- 5 files changed, 68 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e8bf1fa..7532108 100644 --- a/README.md +++ b/README.md @@ -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 => { - 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 ( <> @@ -47,7 +72,20 @@ export function UsageInstructions() { textAlign: "center" }} > - ~/lsfg %command% + {launchOption} + + + + +
+ {launchExplanation}
@@ -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. -- cgit v1.2.3