summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md14
-rw-r--r--py_modules/lsfg_vk/constants.py2
-rw-r--r--py_modules/lsfg_vk/plugin.py8
-rw-r--r--src/components/SmartClipboardButton.tsx9
-rw-r--r--src/components/UsageInstructions.tsx42
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<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>
</>