diff options
| -rw-r--r-- | .github/FUNDING.yml | 1 | ||||
| -rw-r--r-- | .github/workflows/release.yml | 2 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | backend/decky_loader/localplatform/localplatformlinux.py | 26 | ||||
| -rw-r--r-- | frontend/package.json | 2 | ||||
| -rw-r--r-- | frontend/pnpm-lock.yaml | 10 | ||||
| -rw-r--r-- | frontend/src/components/TitleView.tsx | 1 | ||||
| -rw-r--r-- | frontend/src/components/settings/pages/testing/index.tsx | 6 | ||||
| -rw-r--r-- | frontend/src/components/store/Store.tsx | 1 | ||||
| -rw-r--r-- | frontend/src/index.ts | 10 | ||||
| -rw-r--r-- | frontend/src/tabs-hook.tsx | 25 | ||||
| -rw-r--r-- | frontend/src/toaster.tsx | 1 |
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 @@ -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, |
