summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/FUNDING.yml1
-rw-r--r--.github/workflows/release.yml2
-rw-r--r--README.md2
-rw-r--r--backend/decky_loader/localplatform/localplatformlinux.py26
-rw-r--r--frontend/package.json2
-rw-r--r--frontend/pnpm-lock.yaml10
-rw-r--r--frontend/src/components/TitleView.tsx1
-rw-r--r--frontend/src/components/settings/pages/testing/index.tsx6
-rw-r--r--frontend/src/components/store/Store.tsx1
-rw-r--r--frontend/src/index.ts10
-rw-r--r--frontend/src/tabs-hook.tsx25
-rw-r--r--frontend/src/toaster.tsx1
12 files changed, 50 insertions, 37 deletions
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index d3c9cb2c..00000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1 +0,0 @@
-open_collective: steamdeckhomebrew
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b8a0f724..ac1637e4 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -36,7 +36,7 @@ jobs:
uses: actions/checkout@v4
- name: Install semver-tool asdf
- uses: asdf-vm/actions/install@v3
+ uses: asdf-vm/actions/install@v4
with:
tool_versions: |
semver 3.4.0
diff --git a/README.md b/README.md
index 4ce7261a..87b8bd44 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@
[Become a backer or sponsor](https://opencollective.com/steamdeckhomebrew) to support our work! Contributing to our collective effort will help Decky Loader developers cover the costs of web servers, acquire new development hardware, and more.
<!-- SPONSORS COMMENTED OUT UNTIL WE GET SOME SPONSORS TO AVOID BLANK SVG SPACE -->
-<!-- <a href="https://opencollective.com/steamdeckhomebrew"><img alt="Steam Deck Homebrew sponsors on Open Collective" src="https://opencollective.com/steamdeckhomebrew/sponsors.svg?button=true&avatarHeight=46&width=750"></a> -->
+<a href="https://opencollective.com/steamdeckhomebrew"><img alt="Steam Deck Homebrew sponsors on Open Collective" src="https://opencollective.com/steamdeckhomebrew/sponsors.svg?button=true&avatarHeight=46&width=750"></a>
<a href="https://opencollective.com/steamdeckhomebrew"><img alt="Steam Deck Homebrew backers on Open Collective" src="https://opencollective.com/steamdeckhomebrew/backers.svg?button=false&avatarHeight=46&width=750"></a>
diff --git a/backend/decky_loader/localplatform/localplatformlinux.py b/backend/decky_loader/localplatform/localplatformlinux.py
index 1c8f2ace..21993e4c 100644
--- a/backend/decky_loader/localplatform/localplatformlinux.py
+++ b/backend/decky_loader/localplatform/localplatformlinux.py
@@ -116,28 +116,26 @@ def get_username() -> str:
return _get_user()
def setgid(user : UserType = UserType.HOST_USER):
- user_id = 0
-
- if user == UserType.HOST_USER:
- user_id = _get_user_group_id()
+ host_user_group_id, effective_user_group_id = _get_user_group_id(), _get_effective_user_group_id()
+ if host_user_group_id == effective_user_group_id:
+ pass
+ elif user == UserType.HOST_USER:
+ os.setgid(host_user_group_id)
elif user == UserType.EFFECTIVE_USER:
- pass # we already are
+ os.setgid(effective_user_group_id)
else:
raise Exception("Unknown user type")
-
- os.setgid(user_id)
def setuid(user : UserType = UserType.HOST_USER):
- user_id = 0
-
- if user == UserType.HOST_USER:
- user_id = _get_user_id()
+ host_user_id, effective_user_id = _get_user_id(), _get_effective_user_id()
+ if host_user_id == effective_user_id:
+ pass
+ elif user == UserType.HOST_USER:
+ os.setuid(host_user_id)
elif user == UserType.EFFECTIVE_USER:
- pass # we already are
+ os.setuid(effective_user_id)
else:
raise Exception("Unknown user type")
-
- os.setuid(user_id)
async def service_active(service_name : str) -> bool:
res, _, _ = await run(["systemctl", "is-active", service_name], stdout=DEVNULL, stderr=DEVNULL)
diff --git a/frontend/package.json b/frontend/package.json
index ce311043..b0eb2f51 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -47,7 +47,7 @@
}
},
"dependencies": {
- "@decky/ui": "^4.11.1",
+ "@decky/ui": "^4.11.4",
"compare-versions": "^6.1.1",
"filesize": "^10.1.2",
"i18next": "^25.6.0",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 22ca7d64..2b047aa8 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -9,8 +9,8 @@ importers:
.:
dependencies:
'@decky/ui':
- specifier: ^4.11.1
- version: 4.11.1
+ specifier: ^4.11.4
+ version: 4.11.4
compare-versions:
specifier: ^6.1.1
version: 6.1.1
@@ -222,8 +222,8 @@ packages:
'@decky/api@1.1.3':
resolution: {integrity: sha512-XsPCZxfxk5I1UtylIUN3qaWQI31siQbKfbLIskkI5innEatY1m4NQqBv/6hwPaO9mKMbdqYpnh5PSJDeMEOOBA==}
- '@decky/ui@4.11.1':
- resolution: {integrity: sha512-+x+rJB0MBQSQGp0UpsRJ4BOv7zlHzcBPT76enopjGf56H41beR8VZua9F4upLtDgPku4Zh8z3uB53nFlvTilXQ==}
+ '@decky/ui@4.11.4':
+ resolution: {integrity: sha512-8rANkj5vkYTcT7VBBUzlBuowyBctU8gU5reWtsntmYdr7dGPLRqfgKDRqVH09HCd5plXyJKWDSpqiDsUHmKRJg==}
'@esbuild/aix-ppc64@0.20.2':
resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
@@ -2311,7 +2311,7 @@ snapshots:
'@decky/api@1.1.3': {}
- '@decky/ui@4.11.1': {}
+ '@decky/ui@4.11.4': {}
'@esbuild/aix-ppc64@0.20.2':
optional: true
diff --git a/frontend/src/components/TitleView.tsx b/frontend/src/components/TitleView.tsx
index 0cb82b7f..cce779ff 100644
--- a/frontend/src/components/TitleView.tsx
+++ b/frontend/src/components/TitleView.tsx
@@ -8,7 +8,6 @@ import { useDeckyState } from './DeckyState';
const titleStyles: CSSProperties = {
display: 'flex',
- paddingTop: '3px',
paddingRight: '16px',
position: 'sticky',
top: '0px',
diff --git a/frontend/src/components/settings/pages/testing/index.tsx b/frontend/src/components/settings/pages/testing/index.tsx
index 3c032361..0f8b5ebe 100644
--- a/frontend/src/components/settings/pages/testing/index.tsx
+++ b/frontend/src/components/settings/pages/testing/index.tsx
@@ -66,9 +66,9 @@ export default function TestingVersionList() {
if (testingVersions.length === 0) {
return (
- <div>
+ <DialogBody>
<p>No open PRs found</p>
- </div>
+ </DialogBody>
);
}
@@ -80,7 +80,7 @@ export default function TestingVersionList() {
<ul style={{ listStyleType: 'none', padding: '0' }}>
{testingVersions.map((version) => {
return (
- <li>
+ <li key={`${version.id}_${version.name}`}>
<Field
label={
<>
diff --git a/frontend/src/components/store/Store.tsx b/frontend/src/components/store/Store.tsx
index 72187cbc..f1d50033 100644
--- a/frontend/src/components/store/Store.tsx
+++ b/frontend/src/components/store/Store.tsx
@@ -240,6 +240,7 @@ const BrowseTab: FC<{ setPluginCount: Dispatch<SetStateAction<number | null>> }>
})
.map((plugin: StorePlugin) => (
<PluginCard
+ key={`${plugin.id}_${plugin.name}`}
storePlugin={plugin}
installedPlugin={installedPlugins.find((installedPlugin) => installedPlugin.name === plugin.name)}
/>
diff --git a/frontend/src/index.ts b/frontend/src/index.ts
index 4f4ff4f7..7ef5087f 100644
--- a/frontend/src/index.ts
+++ b/frontend/src/index.ts
@@ -22,11 +22,13 @@
DFLWebpack.findModule((m) => m.createPortal && m.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE);
console.debug('[Decky:Boot] Setting up JSX internals...');
- const jsx = DFLWebpack.findModule((m) => m.jsx && Object.keys(m).length == 1)?.jsx;
- if (jsx) {
+ const jsxModule = DFLWebpack.findModule((m) => (m.jsx && m.jsxs) || (m.jsx && Object.keys(m).length == 1));
+ if (jsxModule.jsxs) {
+ window.SP_JSX = jsxModule;
+ } else {
window.SP_JSX = {
- jsx,
- jsxs: jsx,
+ jsx: jsxModule.jsx,
+ jsxs: jsxModule.jsx,
Fragment: window.SP_REACT.Fragment,
};
}
diff --git a/frontend/src/tabs-hook.tsx b/frontend/src/tabs-hook.tsx
index a70c6580..5d9518fd 100644
--- a/frontend/src/tabs-hook.tsx
+++ b/frontend/src/tabs-hook.tsx
@@ -29,7 +29,8 @@ interface Tab {
class TabsHook extends Logger {
// private keys = 7;
tabs: Tab[] = [];
- private qamPatch?: Patch;
+ private qamBrowserViewPatch?: Patch;
+ private qamEmbeddedPatch?: Patch;
constructor() {
super('TabsHook');
@@ -40,11 +41,13 @@ class TabsHook extends Logger {
}
init() {
- // TODO patch the "embedded" renderer in this module too (seems to be for VR? unsure)
const qamModule = findModuleByExport((e) => e?.type?.toString?.()?.includes('QuickAccessMenuBrowserView'));
- const qamRenderer = Object.values(qamModule).find((e: any) =>
+ const qamBrowserViewRenderer = Object.values(qamModule).find((e: any) =>
e?.type?.toString?.()?.includes('QuickAccessMenuBrowserView'),
);
+ const qamEmbeddedRenderer = Object.values(qamModule).find((e: any) =>
+ e?.type?.toString?.()?.includes('QuickAccessMenuEmbedded'),
+ );
const patchHandler = createReactTreePatcher(
[(tree) => findInReactTree(tree, (node) => node?.props?.onFocusNavDeactivated)],
@@ -56,12 +59,21 @@ class TabsHook extends Logger {
'TabsHook',
);
- this.qamPatch = afterPatch(qamRenderer, 'type', patchHandler);
+ this.qamBrowserViewPatch = afterPatch(qamBrowserViewRenderer, 'type', patchHandler);
+ if (qamEmbeddedRenderer) this.qamEmbeddedPatch = afterPatch(qamEmbeddedRenderer, 'type', patchHandler);
// Patch already rendered qam
const root = getReactRoot(document.getElementById('root') as any);
- const qamNode = root && findInReactTree(root, (n: any) => n.elementType == qamRenderer); // need elementType, because type is actually mobx wrapper
+ const qamNode =
+ root &&
+ findInReactTree(
+ root,
+ (n: any) =>
+ n.elementType == qamBrowserViewRenderer ||
+ (qamEmbeddedRenderer != null && n.elementType == qamEmbeddedRenderer),
+ ); // need elementType, because type is actually mobx wrapper
if (qamNode) {
+ console.log('patching existing qam');
// Only affects this fiber node so we don't need to unpatch here
qamNode.type = qamNode.elementType.type;
if (qamNode?.alternate) {
@@ -71,7 +83,8 @@ class TabsHook extends Logger {
}
deinit() {
- this.qamPatch?.unpatch();
+ this.qamBrowserViewPatch?.unpatch();
+ this.qamEmbeddedPatch?.unpatch();
}
add(tab: Tab) {
diff --git a/frontend/src/toaster.tsx b/frontend/src/toaster.tsx
index 2305b870..99f8023e 100644
--- a/frontend/src/toaster.tsx
+++ b/frontend/src/toaster.tsx
@@ -81,6 +81,7 @@ class Toaster extends Logger {
const info = {
showToast: toast.showToast,
sound: toast.sound,
+ playSound: toast.playSound,
eFeature: 0,
toastDurationMS: toastData.nToastDurationMS,
bCritical: toast.critical,