summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxXJSONDeruloXx <danielhimebauch@gmail.com>2026-09-10 20:49:05 -0400
committerxXJSONDeruloXx <danielhimebauch@gmail.com>2026-09-10 20:49:05 -0400
commit904e2e6131071c3b132d3148947b613c2830b1bb (patch)
tree900284bf2a10f59a778cd0871d354a9a8885c155
parent8fd3e86ad0dcd74096e1dcbe2c7f5944b83c9bcc (diff)
downloaddecky-lsfg-vk-v2-flatpak-profiles.tar.gz
decky-lsfg-vk-v2-flatpak-profiles.zip
fix; correct flatpak extension sourcesv2-flatpak-profileschore/migrate
-rw-r--r--justfile3
-rw-r--r--package.json15
-rw-r--r--py_modules/lsfg_vk/constants.py3
-rw-r--r--py_modules/lsfg_vk/flatpak_service.py60
-rw-r--r--src/components/FlatpakTab.tsx4
-rw-r--r--tests/test_flatpak_service.py41
6 files changed, 75 insertions, 51 deletions
diff --git a/justfile b/justfile
index d3a7674..b608987 100644
--- a/justfile
+++ b/justfile
@@ -8,7 +8,8 @@ deploy:
./scripts/deploy-to-deck.sh
test:
- scp "out/Decky LSFG-VK.zip" deck@192.168.0.6:~/Desktop
+ node --experimental-strip-types --test tests/steamLaunchOptions.test.ts
+ python3.12 -m unittest discover -s tests -p 'test_*.py'
watch:
ssh deck@192.168.0.6 "journalctl -f"
diff --git a/package.json b/package.json
index b5e716c..4a1780a 100644
--- a/package.json
+++ b/package.json
@@ -52,21 +52,6 @@
"name": "lsfg-vk-2.0.0.tar.xz",
"url": "https://builds.lsfg-vk.dev/lsfg-vk-2.0.0.tar.xz",
"sha256hash": "08bdbdf373a111022df87dac7aa87e3b564bb841f961552e3ca85fea12b5aa74"
- },
- {
- "name": "org.freedesktop.Platform.VulkanLayer.lsfg_vk_23.08.flatpak",
- "url": "https://github.com/xXJSONDeruloXx/lsfg-vk/releases/download/v2.0.0-decky.2/org.freedesktop.Platform.VulkanLayer.lsfg_vk_23.08.flatpak",
- "sha256hash": "7eff81f96b278fde6fe395c88461c55e611547bf5991d179b9145ec6f5a778b1"
- },
- {
- "name": "org.freedesktop.Platform.VulkanLayer.lsfg_vk_24.08.flatpak",
- "url": "https://github.com/xXJSONDeruloXx/lsfg-vk/releases/download/v2.0.0-decky.2/org.freedesktop.Platform.VulkanLayer.lsfg_vk_24.08.flatpak",
- "sha256hash": "cbd663b9021c355dddec61ec51fd4388c12705f16637cadd4b45aead0e5dc427"
- },
- {
- "name": "org.freedesktop.Platform.VulkanLayer.lsfg_vk_25.08.flatpak",
- "url": "https://github.com/xXJSONDeruloXx/lsfg-vk/releases/download/v2.0.0-decky.2/org.freedesktop.Platform.VulkanLayer.lsfg_vk_25.08.flatpak",
- "sha256hash": "615e87c03b18368ed1cca97e036f1bf54fff95fc6126aac697bb368f33281cbf"
}
],
"pnpm": {
diff --git a/py_modules/lsfg_vk/constants.py b/py_modules/lsfg_vk/constants.py
index 960d230..45ac4c5 100644
--- a/py_modules/lsfg_vk/constants.py
+++ b/py_modules/lsfg_vk/constants.py
@@ -16,9 +16,6 @@ CLI_FILENAME = "lsfg-vk-cli"
UI_FILENAME = "lsfg-vk-ui"
UI_DESKTOP_FILENAME = "gay.pancake.lsfg-vk-ui.desktop"
UI_ICON_FILENAME = "gay.pancake.lsfg-vk-ui.png"
-FLATPAK_23_08_FILENAME = "org.freedesktop.Platform.VulkanLayer.lsfg_vk_23.08.flatpak"
-FLATPAK_24_08_FILENAME = "org.freedesktop.Platform.VulkanLayer.lsfg_vk_24.08.flatpak"
-FLATPAK_25_08_FILENAME = "org.freedesktop.Platform.VulkanLayer.lsfg_vk_25.08.flatpak"
STEAM_LOSSLESS_SCALING_APP_ID = "993090"
STEAM_LOSSLESS_SCALING_BRANCH = "lsfg-vk"
diff --git a/py_modules/lsfg_vk/flatpak_service.py b/py_modules/lsfg_vk/flatpak_service.py
index 62f6a50..4f04382 100644
--- a/py_modules/lsfg_vk/flatpak_service.py
+++ b/py_modules/lsfg_vk/flatpak_service.py
@@ -12,17 +12,12 @@ from pathlib import Path
from typing import Dict, Optional, Set
from .base_service import BaseService
-from .constants import (
- BIN_DIR,
- FLATPAK_23_08_FILENAME,
- FLATPAK_24_08_FILENAME,
- FLATPAK_25_08_FILENAME,
-)
class FlatpakService(BaseService):
EXTENSION_ID = "org.freedesktop.Platform.VulkanLayer.lsfgvk"
- SUPPORTED_RUNTIMES = ("23.08", "24.08", "25.08")
+ FLATHUB_REMOTE = "flathub"
+ SUPPORTED_RUNTIMES = ("24.08", "25.08")
DERIVED_RUNTIME_IDS = {"org.gnome.Platform", "org.kde.Platform"}
RUNTIME_METADATA_SECTION = "Extension org.freedesktop.Platform.GL"
OWNERSHIP_FILENAME = "flatpak_state.json"
@@ -34,6 +29,7 @@ class FlatpakService(BaseService):
def __init__(self, logger=None):
super().__init__(logger)
self.flatpak_command: Optional[str] = None
+ self._verified_branches: Set[str] = set()
self._lock = threading.RLock()
@property
@@ -115,14 +111,6 @@ class FlatpakService(BaseService):
def _extension_ref(cls, branch: str) -> str:
return f"{cls.EXTENSION_ID}/x86_64/{cls._validate_runtime(branch)}"
- def _bundled_extension_path(self, branch: str) -> Path:
- filename = {
- "23.08": FLATPAK_23_08_FILENAME,
- "24.08": FLATPAK_24_08_FILENAME,
- "25.08": FLATPAK_25_08_FILENAME,
- }[self._validate_runtime(branch)]
- return Path(__file__).resolve().parent.parent.parent / BIN_DIR / filename
-
def _installed_extension_branches(self, scope: Optional[str] = None) -> Set[str]:
scopes = ("user", "system") if scope is None else (scope,)
installed = set()
@@ -139,6 +127,14 @@ class FlatpakService(BaseService):
installed.add(fields[2])
return installed
+ def _user_extension_origin(self, branch: str) -> str:
+ result = self._run_flatpak_command(
+ ["info", "--user", "--show-origin", self._extension_ref(branch)],
+ capture_output=True,
+ text=True,
+ )
+ return result.stdout.strip() if result.returncode == 0 else ""
+
def _empty_state(self) -> Dict[str, object]:
return {
"version": self.OWNERSHIP_VERSION,
@@ -343,14 +339,29 @@ class FlatpakService(BaseService):
if not self.check_flatpak_available():
raise FileNotFoundError("Flatpak is not available on this system")
with self._lock:
- installed = self._installed_extension_branches()
- if branch in installed:
+ if branch in self._verified_branches:
return self._extension_result(branch, True, False, "is ready")
- bundle = self._bundled_extension_path(branch)
- if not bundle.is_file():
- raise FileNotFoundError(f"Bundled Flatpak extension not found at {bundle}; reinstall the plugin")
+ user_installed = self._installed_extension_branches("user")
+ system_installed = self._installed_extension_branches("system")
+ if branch in system_installed and branch not in user_installed:
+ return self._extension_result(branch, True, False, "is ready")
+ if branch in user_installed and self._user_extension_origin(branch) != self.FLATHUB_REMOTE:
+ result = self._run_flatpak_command(
+ ["uninstall", "--user", "--noninteractive", self._extension_ref(branch)],
+ capture_output=True,
+ text=True,
+ )
+ if result.returncode != 0:
+ raise OSError(result.stderr.strip() or "Could not replace the existing Flatpak extension")
result = self._run_flatpak_command(
- ["install", "--user", "--noninteractive", "--or-update", str(bundle)],
+ [
+ "install",
+ "--user",
+ "--noninteractive",
+ "--or-update",
+ self.FLATHUB_REMOTE,
+ f"{self.EXTENSION_ID}//{branch}",
+ ],
capture_output=True,
text=True,
)
@@ -363,6 +374,7 @@ class FlatpakService(BaseService):
owned.add(branch)
state["plugin_owned_branches"] = sorted(owned)
self._write_state(state)
+ self._verified_branches.add(branch)
return self._extension_result(branch, True, False, "installed")
except Exception as error:
return self._error_response(dict, str(error), runtime_branch=branch, installed=False, enabled=False)
@@ -410,12 +422,6 @@ class FlatpakService(BaseService):
return self._error_response(dict, str(error), runtime_branch=branch, removed=False, installed=False, enabled=False)
def ensure_extension(self, branch: str):
- try:
- branch = self._validate_runtime(branch)
- if branch in self._installed_extension_branches():
- return self._extension_result(branch, True, False, "is ready")
- except Exception as error:
- return self._error_response(dict, str(error), runtime_branch=branch, installed=False, enabled=False)
return self.install_extension(branch)
def set_extension_enabled(self, branch: str, enabled: bool):
diff --git a/src/components/FlatpakTab.tsx b/src/components/FlatpakTab.tsx
index 6392d59..c5e27f5 100644
--- a/src/components/FlatpakTab.tsx
+++ b/src/components/FlatpakTab.tsx
@@ -40,12 +40,12 @@ export function FlatpakTab({
if (!selectedAppId) {
return (
<PanelSection title="Flatpak">
- <PanelSectionRow>
+ {/* <PanelSectionRow>
<Field
label="Flatpak applications"
description="Enable LSFG-VK directly for a Flatpak. Steam shortcuts and launcher scripts are not modified."
/>
- </PanelSectionRow>
+ </PanelSectionRow> */}
{apps.map((app) => {
const status = app.enabled
? app.app_id === runningApp?.app_id ? "Enabled ยท Running" : "Enabled"
diff --git a/tests/test_flatpak_service.py b/tests/test_flatpak_service.py
index 065871b..4d804c7 100644
--- a/tests/test_flatpak_service.py
+++ b/tests/test_flatpak_service.py
@@ -32,10 +32,8 @@ class FlatpakServiceTests(unittest.TestCase):
self.runtime_metadata = ""
self.user_branches = set()
self.system_branches = set()
+ self.user_extension_origin = "flathub"
self.apps = {"com.example.Game": "Example Game"}
- self.bundle = self.home / "lsfg-vk.flatpak"
- self.bundle.write_bytes(b"bundle")
- self.service._bundled_extension_path = Mock(return_value=self.bundle)
self.dll_dir = self.home / ".local/share/Steam/steamapps/common/Lossless Scaling"
self.service._dll_directory = Mock(return_value=self.dll_dir)
@@ -120,6 +118,8 @@ class FlatpakServiceTests(unittest.TestCase):
return self._result(self.runtime_ref + "\n")
if args[:2] == ["info", "--show-metadata"]:
return self._result(self.runtime_metadata)
+ if args[:3] == ["info", "--user", "--show-origin"]:
+ return self._result(self.user_extension_origin)
if args[:2] == ["list", "--app"]:
return self._result("".join(f"{name}\t{app_id}\n" for app_id, name in self.apps.items()))
if args[0] == "list":
@@ -157,6 +157,22 @@ class FlatpakServiceTests(unittest.TestCase):
self.assertTrue(response["owned"])
self.assertEqual(response["runtime_branch"], "24.08")
self.assertEqual(self.user_branches, {"24.08"})
+ install_calls = [
+ call.args[0]
+ for call in self.service._run_flatpak_command.call_args_list
+ if call.args[0][0] == "install"
+ ]
+ self.assertEqual(
+ install_calls,
+ [[
+ "install",
+ "--user",
+ "--noninteractive",
+ "--or-update",
+ "flathub",
+ "org.freedesktop.Platform.VulkanLayer.lsfgvk//24.08",
+ ]],
+ )
status = self.service._app_override_status("com.example.Game")
self.assertTrue(status["prepared"])
content = self.service._override_path("com.example.Game").read_text(encoding="utf-8")
@@ -180,6 +196,25 @@ class FlatpakServiceTests(unittest.TestCase):
install_calls = [call for call in self.service._run_flatpak_command.call_args_list if call.args[0][0] == "install"]
self.assertEqual(len(install_calls), 1)
+ def test_replaces_extension_from_another_remote(self):
+ self.user_branches = {"24.08"}
+ self.user_extension_origin = "lsfgvk-origin"
+
+ response = self.service.install_extension("24.08")
+
+ self.assertTrue(response["success"])
+ commands = [call.args[0] for call in self.service._run_flatpak_command.call_args_list]
+ self.assertIn(
+ [
+ "uninstall",
+ "--user",
+ "--noninteractive",
+ "org.freedesktop.Platform.VulkanLayer.lsfgvk/x86_64/24.08",
+ ],
+ commands,
+ )
+ self.assertEqual(self.user_branches, {"24.08"})
+
def test_preinstalled_runtime_is_not_owned(self):
self.system_branches = {"24.08"}
response = self.service.prepare_app("com.example.Game")