From a9488260d0f71930200b51c8bccf235e17463e63 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Tue, 14 Apr 2026 20:43:52 +0200 Subject: [PATCH 01/13] Add RetroDECK support --- .github/workflows/release.yml | 6 +- cfw/cfw.go | 27 +-- cfw/retrodeck/data/platforms.json | 313 ++++++++++++++++++++++++++++++ cfw/retrodeck/retrodeck.go | 72 +++++++ scripts/RetroDECK/Grout.sh | 16 ++ taskfiles/build.yml | 25 ++- taskfiles/package.yml | 10 + 7 files changed, 448 insertions(+), 21 deletions(-) create mode 100644 cfw/retrodeck/data/platforms.json create mode 100644 cfw/retrodeck/retrodeck.go create mode 100644 scripts/RetroDECK/Grout.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 23306b5..a14cdf7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -140,12 +140,13 @@ jobs: env: GROUT_VERSION: ${{ needs.prepare.outputs.version }} - - name: Package Batocera AMD64 - run: task package:batocera-amd64 + - name: Package AMD64 platforms + run: task package:batocera-amd64 package:retrodeck - name: Create distribution run: | cd dist/Batocera-amd64 && zip -r ../Grout-Batocera-amd64.zip Grout.sh Grout + cd dist/RetroDECK && zip -r ../Grout-RetroDECK.zip Grout.sh Grout - name: Upload artifacts uses: actions/upload-artifact@v4 @@ -153,6 +154,7 @@ jobs: name: amd64-artifacts path: | dist/Grout-Batocera-amd64.zip + dist/Grout-RetroDECK.zip build-x86: needs: prepare diff --git a/cfw/cfw.go b/cfw/cfw.go index 4e628f0..4d320e7 100644 --- a/cfw/cfw.go +++ b/cfw/cfw.go @@ -9,16 +9,17 @@ import ( type CFW string const ( - NextUI CFW = "NEXTUI" - MuOS CFW = "MUOS" - Knulli CFW = "KNULLI" - Spruce CFW = "SPRUCE" - ROCKNIX CFW = "ROCKNIX" - Trimui CFW = "TRIMUI" - Allium CFW = "ALLIUM" - Onion CFW = "ONION" - Batocera CFW = "BATOCERA" - MinUI CFW = "MINUI" + NextUI CFW = "NEXTUI" + MuOS CFW = "MUOS" + Knulli CFW = "KNULLI" + Spruce CFW = "SPRUCE" + ROCKNIX CFW = "ROCKNIX" + Trimui CFW = "TRIMUI" + Allium CFW = "ALLIUM" + Onion CFW = "ONION" + Batocera CFW = "BATOCERA" + MinUI CFW = "MINUI" + RetroDECK CFW = "RETRODECK" ) func GetCFW() CFW { @@ -26,18 +27,18 @@ func GetCFW() CFW { cfw := CFW(cfwEnv) switch cfw { - case MuOS, NextUI, Knulli, Spruce, ROCKNIX, Trimui, Allium, Onion, Batocera, MinUI: + case MuOS, NextUI, Knulli, Spruce, ROCKNIX, Trimui, Allium, Onion, Batocera, MinUI, RetroDECK: return cfw default: log.SetOutput(os.Stderr) - log.Fatalf("Unsupported CFW: '%s'. Valid options: NextUI, muOS, Knulli, Spruce, ROCKNIX, Trimui, Allium, Onion, Batocera, MinUI", cfwEnv) + log.Fatalf("Unsupported CFW: '%s'. Valid options: NextUI, muOS, Knulli, Spruce, ROCKNIX, Trimui, Allium, Onion, Batocera, MinUI, RetroDECK", cfwEnv) return "" } } func (c CFW) IsBasedOnEmulationStation() bool { switch c { - case Knulli, ROCKNIX, Batocera: + case Knulli, ROCKNIX, Batocera, RetroDECK: return true default: return false diff --git a/cfw/retrodeck/data/platforms.json b/cfw/retrodeck/data/platforms.json new file mode 100644 index 0000000..b8b7736 --- /dev/null +++ b/cfw/retrodeck/data/platforms.json @@ -0,0 +1,313 @@ +{ + "3do": [ + "3do" + ], + "acorn-archimedes": [ + "archimedes" + ], + "acorn-electron": [ + "electron" + ], + "acpc": [ + "amstradcpc" + ], + "amiga": [ + "amiga", + "amiga1200", + "amiga600" + ], + "amiga-cd32": [ + "amigacd32" + ], + "amstrad-gx4000": [ + "gx4000" + ], + "appleii": [ + "apple2" + ], + "apple-iigs": [ + "apple2gs" + ], + "arcade": [ + "arcade" + ], + "arcadia-2001": [ + "arcadia" + ], + "arduboy": [ + "arduboy" + ], + "astrocade": [ + "astrocde" + ], + "atari2600": [ + "atari2600" + ], + "atari5200": [ + "atari5200" + ], + "atari7800": [ + "atari7800" + ], + "atari800": [ + "atari800" + ], + "atari-st": [ + "atarist" + ], + "atari-xegs": [ + "atarixe" + ], + "bbcmicro": [ + "bbcmicro" + ], + "c64": [ + "c64" + ], + "casio-pv-1000": [ + "pv1000" + ], + "colecoadam": [ + "adam" + ], + "colecovision": [ + "colecovision" + ], + "commodore-cdtv": [ + "cdtv" + ], + "c-plus-4": [ + "plus4" + ], + "creativision": [ + "crvision" + ], + "dc": [ + "dreamcast" + ], + "dos": [ + "dos" + ], + "epoch-super-cassette-vision": [ + "scv" + ], + "famicom": [ + "famicom" + ], + "fairchild-channel-f": [ + "channelf" + ], + "fds": [ + "fds" + ], + "fm-7": [ + "fm7" + ], + "fm-towns": [ + "fmtowns" + ], + "g-and-w": [ + "gameandwatch" + ], + "gamate": [ + "gamate" + ], + "game-dot-com": [ + "gamecom" + ], + "gamegear": [ + "gamegear" + ], + "gb": [ + "gb" + ], + "gba": [ + "gba" + ], + "gbc": [ + "gbc" + ], + "genesis": [ + "genesis", + "megadrive" + ], + "hartung": [ + "gmaster" + ], + "intellivision": [ + "intellivision" + ], + "j2me": [ + "j2me" + ], + "jaguar": [ + "atarijaguar" + ], + "lynx": [ + "atarilynx" + ], + "mac": [ + "macintosh" + ], + "mega-duck-slash-cougar-boy": [ + "megaduck" + ], + "model2": [ + "model2" + ], + "msx": [ + "msx", + "msx1" + ], + "msx2": [ + "msx2" + ], + "msx-turbo": [ + "msxturbor" + ], + "mugen": [ + "mugen" + ], + "multivision": [ + "multivision" + ], + "n64": [ + "n64" + ], + "64dd": [ + "n64dd" + ], + "nds": [ + "nds" + ], + "neo-geo-cd": [ + "neogeocd", + "neogeocdjp" + ], + "neo-geo-pocket": [ + "ngp" + ], + "neo-geo-pocket-color": [ + "ngpc" + ], + "neogeoaes": [ + "neogeo" + ], + "nes": [ + "nes" + ], + "ngc": [ + "gc" + ], + "3ds": [ + "n3ds" + ], + "odyssey-2": [ + "odyssey2" + ], + "openbor": [ + "openbor" + ], + "palm-os": [ + "palm" + ], + "pc-8800-series": [ + "pc88" + ], + "pc-9800-series": [ + "pc98" + ], + "pc-fx": [ + "pcfx" + ], + "philips-cd-i": [ + "cdimono1" + ], + "pokemon-mini": [ + "pokemini" + ], + "ps2": [ + "ps2" + ], + "ps3": [ + "ps3" + ], + "psp": [ + "psp" + ], + "psvita": [ + "psvita" + ], + "psx": [ + "psx" + ], + "satellaview": [ + "satellaview" + ], + "saturn": [ + "saturn", + "saturnjp" + ], + "scummvm": [ + "scummvm" + ], + "sega32": [ + "sega32x", + "sega32xjp", + "sega32xna" + ], + "segacd": [ + "megacd", + "megacdjp", + "segacd" + ], + "sfc": [ + "sfc" + ], + "sg1000": [ + "sg-1000" + ], + "sms": [ + "mastersystem", + "mark3" + ], + "stv": [ + "stv" + ], + "supergrafx": [ + "supergrafx" + ], + "switch": [ + "switch" + ], + "vic-20": [ + "vic20" + ], + "virtualboy": [ + "virtualboy" + ], + "wii": [ + "wii" + ], + "wiiu": [ + "wiiu" + ], + "wonderswan": [ + "wonderswan" + ], + "x1": [ + "x1" + ], + "sharp-x68000": [ + "x68000" + ], + "xbox": [ + "xbox" + ], + "zx81": [ + "zx81" + ], + "zxspectrum": [ + "zxspectrum" + ] +} diff --git a/cfw/retrodeck/retrodeck.go b/cfw/retrodeck/retrodeck.go new file mode 100644 index 0000000..20f9a65 --- /dev/null +++ b/cfw/retrodeck/retrodeck.go @@ -0,0 +1,72 @@ +package retrodeck + +import ( + "embed" + "grout/internal/jsonutil" + "os" + "path/filepath" +) + +//go:embed data/*.json +var embeddedFiles embed.FS + +var ( + Platforms = jsonutil.MustLoadJSONMap[string, []string](embeddedFiles, "data/platforms.json") +) + +func GetBasePath() string { + if basePath := os.Getenv("BASE_PATH"); basePath != "" { + return basePath + } + + homeInstall := "/home/deck/retrodeck" + if _, err := os.Stat(homeInstall); err == nil { + return homeInstall + } + + sdcardInstall := "/run/media/mmcblk0p1/retrodeck" + if _, err := os.Stat(sdcardInstall); err == nil { + return sdcardInstall + } + + if homePath := os.Getenv("HOME"); homePath != "" { + customPath := filepath.Join(homePath, "retrodeck") + if _, err := os.Stat(customPath); err == nil { + return customPath + } + } + + return "/retrodeck" +} + +func GetRomDirectory() string { + return filepath.Join(GetBasePath(), "roms") +} + +func GetBIOSDirectory() string { + return filepath.Join(GetBasePath(), "bios") +} + +func GetBaseSavePath() string { + return filepath.Join(GetBasePath(), "saves") +} + +func GetArtDirectory(romDir string) string { + return filepath.Join(romDir, "images") +} + +func GetGroutGamelist() string { + return filepath.Join(GetRomDirectory(), "ports", "gamelist.xml") +} + +func GetVideoDirectory(romDir string) string { + return filepath.Join(romDir, "videos") +} + +func GetBezelDirectory(romDir string) string { + return filepath.Join(romDir, "bezels") +} + +func GetManualDirectory(romDir string) string { + return filepath.Join(romDir, "manuals") +} diff --git a/scripts/RetroDECK/Grout.sh b/scripts/RetroDECK/Grout.sh new file mode 100644 index 0000000..6d1217c --- /dev/null +++ b/scripts/RetroDECK/Grout.sh @@ -0,0 +1,16 @@ +#!/bin/bash +CUR_DIR="$(dirname "$0")" +cd "$CUR_DIR/Grout" || exit 1 + +# Apply pending update +if [ -d "../.update" ]; then + cp -rf ../.update/* .. + rm -rf ../.update +fi + +export CFW=RETRODECK +export LD_LIBRARY_PATH="$CUR_DIR/Grout/lib:$LD_LIBRARY_PATH" + +./grout + +exit 0 diff --git a/taskfiles/build.yml b/taskfiles/build.yml index e875d1f..f9363bc 100644 --- a/taskfiles/build.yml +++ b/taskfiles/build.yml @@ -22,7 +22,8 @@ tasks: - docker create --name {{.CONTAINER_NAME}}-{{.BUILD_DIR}} --label {{.LABEL}} {{.IMAGE_TAG}} >/dev/null 2>&1 - echo "Extracting {{.BUILD_DIR}}..." - docker cp {{.CONTAINER_NAME}}-{{.BUILD_DIR}}:/build/grout {{.BUILD_DIR}}/grout - - 'if [ -n "{{.LIB_PATH}}" ]; then docker cp {{.CONTAINER_NAME}}-{{.BUILD_DIR}}:{{.LIB_PATH}} {{.BUILD_DIR}}/lib/libSDL2_gfx-1.0.so.0; fi' + - 'if [ -n "{{.GFX_PATH}}" ]; then docker cp {{.CONTAINER_NAME}}-{{.BUILD_DIR}}:{{.GFX_PATH}} {{.BUILD_DIR}}/lib/libSDL2_gfx-1.0.so.0; fi' + - 'if [ -n "{{.TTF_PATH}}" ]; then docker cp {{.CONTAINER_NAME}}-{{.BUILD_DIR}}:{{.TTF_PATH}} {{.BUILD_DIR}}/lib/libSDL2_ttf-2.0.so.0; fi' - docker rm {{.CONTAINER_NAME}}-{{.BUILD_DIR}} >/dev/null 2>&1 - docker image prune --filter "label={{.LABEL}}" -f >/dev/null 2>&1 || true - echo "Extract {{.BUILD_DIR}} complete" @@ -35,7 +36,11 @@ tasks: - task: _build vars: { PLATFORM: linux/arm64, BUILD_DIR: build64, IMAGE_TAG: "{{.IMAGE_NAME}}-arm64", DOCKERFILE: docker/Dockerfile, LOCAL: "{{.LOCAL}}" } - task: _extract - vars: { BUILD_DIR: build64, IMAGE_TAG: "{{.IMAGE_NAME}}-arm64", LIB_PATH: /usr/lib/aarch64-linux-gnu/libSDL2_gfx-1.0.so.0.0.2 } + vars: { + BUILD_DIR: build64, IMAGE_TAG: "{{.IMAGE_NAME}}-arm64", + GFX_PATH: /usr/lib/aarch64-linux-gnu/libSDL2_gfx-1.0.so.0.0.2, + TTF_PATH: /usr/lib/aarch64-linux-gnu/libSDL2_ttf-2.0.so.0.14.1 + } amd64: desc: Build and extract for AMD64 (x86_64) @@ -43,7 +48,11 @@ tasks: - task: _build vars: { PLATFORM: linux/amd64, BUILD_DIR: build, IMAGE_TAG: "{{.IMAGE_NAME}}-amd64", DOCKERFILE: docker/Dockerfile } - task: _extract - vars: { BUILD_DIR: build, IMAGE_TAG: "{{.IMAGE_NAME}}-amd64", LIB_PATH: /usr/lib/x86_64-linux-gnu/libSDL2_gfx-1.0.so.0.0.2 } + vars: { + BUILD_DIR: build, IMAGE_TAG: "{{.IMAGE_NAME}}-amd64", + GFX_PATH: /usr/lib/x86_64-linux-gnu/libSDL2_gfx-1.0.so.0.0.2, + TTF_PATH: /usr/lib/x86_64-linux-gnu/libSDL2_ttf-2.0.so.0.14.1 + } x86: desc: Build and extract for x86 (32-bit) @@ -51,7 +60,11 @@ tasks: - task: _build vars: { PLATFORM: linux/386, BUILD_DIR: buildx86, IMAGE_TAG: "{{.IMAGE_NAME}}-x86", DOCKERFILE: docker/Dockerfile } - task: _extract - vars: { BUILD_DIR: buildx86, IMAGE_TAG: "{{.IMAGE_NAME}}-x86", LIB_PATH: /usr/lib/i386-linux-gnu/libSDL2_gfx-1.0.so.0.0.2 } + vars: { + BUILD_DIR: buildx86, IMAGE_TAG: "{{.IMAGE_NAME}}-x86", + GFX_PATH: /usr/lib/i386-linux-gnu/libSDL2_gfx-1.0.so.0.0.2, + TTF_PATH: /usr/lib/i386-linux-gnu/libSDL2_ttf-2.0.so.0.14.1 + } arm32: desc: Build and extract for ARM32 @@ -60,6 +73,6 @@ tasks: cmds: - task: _build vars: { PLATFORM: linux/arm/v7, BUILD_DIR: build32, IMAGE_TAG: "{{.IMAGE_NAME}}-arm32", DOCKERFILE: docker/32.Dockerfile, LOCAL: "{{.LOCAL}}" } - # TODO: add LIB_PATH once custom SDL build for Miyoo is ready + # TODO: add GFX_PATH and TTF_PATH once custom SDL build for Miyoo is ready - task: _extract - vars: { BUILD_DIR: build32, IMAGE_TAG: "{{.IMAGE_NAME}}-arm32", LIB_PATH: "" } + vars: { BUILD_DIR: build32, IMAGE_TAG: "{{.IMAGE_NAME}}-arm32", GFX_PATH: "", TTF_PATH: "" } diff --git a/taskfiles/package.yml b/taskfiles/package.yml index b3c3a9a..3c100c8 100644 --- a/taskfiles/package.yml +++ b/taskfiles/package.yml @@ -134,3 +134,13 @@ tasks: - cp -R build/lib/* dist/Batocera-amd64/Grout/lib/ - chmod a+x dist/Batocera-amd64/Grout/grout dist/Batocera-amd64/Grout.sh silent: true + + retrodeck: + cmds: + - rm -rf dist/RetroDECK + - mkdir -p dist/RetroDECK/Grout/lib + - cp scripts/RetroDECK/Grout.sh dist/RetroDECK/ + - cp build/grout README.md LICENSE dist/RetroDECK/Grout/ + - cp -R build/lib/* dist/RetroDECK/Grout/lib/ + - chmod a+x dist/RetroDECK/Grout/grout dist/RetroDECK/Grout.sh + silent: true From 0d725d8b0a3010be07794bf9daec1e82d980ae92 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Tue, 14 Apr 2026 22:54:28 +0200 Subject: [PATCH 02/13] Documentation --- docs/_includes/cfw-links.md | 1 + docs/getting-started/index.md | 1 + docs/getting-started/install-retrodeck.md | 49 ++++++++++ docs/index.md | 2 +- docs/platforms/RETRODECK.md | 107 ++++++++++++++++++++++ mkdocs.yml | 2 + 6 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 docs/getting-started/install-retrodeck.md create mode 100644 docs/platforms/RETRODECK.md diff --git a/docs/_includes/cfw-links.md b/docs/_includes/cfw-links.md index 846018c..8c70d46 100644 --- a/docs/_includes/cfw-links.md +++ b/docs/_includes/cfw-links.md @@ -8,3 +8,4 @@ [rocknix]: https://rocknix.org [spruce]: https://spruceui.github.io/ [trimui]: https://github.com/trimui +[retrodeck]: https://retrodeck.net diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index 3751d96..733644f 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -27,6 +27,7 @@ Choose your platform: - [ROCKNIX Installation](install-rocknix.md) - [Spruce Installation](install-spruce.md) - [TrimUI Installation](install-trimui.md) +- [RetroDECK Installation](install-retrodeck.md) ### Step 2: Launch and Select Language diff --git a/docs/getting-started/install-retrodeck.md b/docs/getting-started/install-retrodeck.md new file mode 100644 index 0000000..78e59cd --- /dev/null +++ b/docs/getting-started/install-retrodeck.md @@ -0,0 +1,49 @@ +# Installation Guide for RetroDECK + +This guide will help you install Grout on devices running [RetroDECK][retrodeck]. + +## Tested Devices + +Grout has been tested on the following devices having RetroDECK installed: + +| Manufacturer | Device | OS | +|--------------|----------|---------| +| Asus | ROG Ally | Bazzite | + +_Please help verify compatibility on other devices by reporting your results!_ + +## Installation Steps + +1. Ensure your device has RetroDECK installed. +2. Download the [latest Grout release](https://github.com/rommapp/grout/releases/latest/download/Grout-RetroDECK.zip) for + RetroDECK. +3. Unzip the downloaded archive. +4. Copy the `Grout` folder to your home directory (`/home/deck/grout/`) +5. Copy the `Grout.sh` file to the same Ports directory (`/home/deck/grout/Grout.sh`) +6. Open Steam and add Grout as a non-Steam game with this command: `/home/deck/grout/Grout.sh %command%` +7. Launch Grout from Steam and enjoy! + +## Update + +### In-App update (Recommended) + +Grout has a built-in update mechanism. To update Grout, launch the application and navigate to the `Settings` menu. From there, +select `Check for Updates`. If a new version is available, follow the on-screen prompts to download and install the update. + +### Manual update + +To update Grout, simply download the latest release and replace the existing Grout folder in your home directory (`/home/deck/grout/`). If you +have made any custom configurations, ensure to back them up before replacing the folder. Be sure to keep the `config.json` +file if you do not want to authenticate again, and configure platforms folder mappings again. + +## Additional Notes + +- Grout doesn't currently support custom RetroDECK install location: you must have selected either the internal or the SD card install. +- It seems like Grout doesn't currently play well with Steam Input, ensure it is disabled or you're using an external controller. +- Given the above and if you're running Bazzite, you may need to configure your handheld so it's seen as an Xbox controller. + +## Next Steps + +After installation is complete, check out the [User Guide](../usage/guide.md) to learn how to use Grout. + +--8<-- "docs/_includes/cfw-links.md" diff --git a/docs/index.md b/docs/index.md index 4be37f8..678a3df 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,7 +13,7 @@ hide: Download and manage games from your [RomM](https://romm.app) instance directly on your Linux based retro handheld. -[Allium](getting-started/install-allium.md) · [Batocera](getting-started/install-batocera.md) · [Knulli](getting-started/install-knulli.md) · [MinUI](getting-started/install-minui.md) · [muOS](getting-started/install-muos.md) · [NextUI](getting-started/install-nextui.md) · [Onion](getting-started/install-onion.md) · [ROCKNIX](getting-started/install-rocknix.md) · [Spruce](getting-started/install-spruce.md) · [TrimUI](getting-started/install-trimui.md) +[Allium](getting-started/install-allium.md) · [Batocera](getting-started/install-batocera.md) · [Knulli](getting-started/install-knulli.md) · [MinUI](getting-started/install-minui.md) · [muOS](getting-started/install-muos.md) · [NextUI](getting-started/install-nextui.md) · [Onion](getting-started/install-onion.md) · [ROCKNIX](getting-started/install-rocknix.md) · [Spruce](getting-started/install-spruce.md) · [TrimUI](getting-started/install-trimui.md) · [RetroDECK](getting-started/install-retrodeck.md) [:fontawesome-solid-gamepad: Get Started](getting-started/index.md){ .md-button .md-button--primary }    diff --git a/docs/platforms/RETRODECK.md b/docs/platforms/RETRODECK.md new file mode 100644 index 0000000..f5c7b79 --- /dev/null +++ b/docs/platforms/RETRODECK.md @@ -0,0 +1,107 @@ +# RetroDECK Platform Mappings + +This table shows the mappings of RomM Fs Slug to RetroDECK's platform folders. + +| Platform Name | RomM Fs Slug | Folder(s) | +|-------------------------------|-----------------------------|-------------------------------| +| 3DO Interactive Multiplayer | 3do | 3do | +| Acorn Archimedes | acorn-archimedes | archimedes | +| Acorn Electron | acorn-electron | electron | +| Amstrad CPC | acpc | amstradcpc | +| Amiga | amiga | amiga, amiga1200, amiga600 | +| Amiga CD32 | amiga-cd32 | amigacd32 | +| Amstrad GX4000 | amstrad-gx4000 | gx4000 | +| Apple II | appleii | apple2 | +| Apple IIGS | apple-iigs | apple2gs | +| Arcade | arcade | arcade | +| Arcadia 2001 | arcadia-2001 | arcadia | +| Arduboy | arduboy | arduboy | +| Bally Astrocade | astrocade | astrocde | +| Atari 2600 | atari2600 | atari2600 | +| Atari 5200 | atari5200 | atari5200 | +| Atari 7800 | atari7800 | atari7800 | +| Atari 800 | atari800 | atari800 | +| Atari ST/STE | atari-st | atarist | +| Atari XEGS | atari-xegs | atarixe | +| BBC Microcomputer System | bbcmicro | bbcmicro | +| Commodore C64/128/MAX | c64 | c64 | +| Casio PV-1000 | casio-pv-1000 | pv1000 | +| Coleco Adam | colecoadam | adam | +| ColecoVision | colecovision | colecovision | +| Commodore CDTV | commodore-cdtv | cdtv | +| Commodore Plus/4 | c-plus-4 | plus4 | +| CreatiVision | creativision | crvision | +| Dreamcast | dc | dreamcast | +| DOS | dos | dos | +| Epoch Super Cassette Vision | epoch-super-cassette-vision | scv | +| Family Computer | famicom | famicom | +| Fairchild Channel F | fairchild-channel-f | channelf | +| Family Computer Disk System | fds | fds | +| FM-7 | fm-7 | fm7 | +| FM Towns | fm-towns | fmtowns | +| Game & Watch | g-and-w | gameandwatch | +| Gamate | gamate | gamate | +| Game.com | game-dot-com | gamecom | +| Sega Game Gear | gamegear | gamegear | +| Game Boy | gb | gb | +| Game Boy Advance | gba | gba | +| Game Boy Color | gbc | gbc | +| Sega Mega Drive/Genesis | genesis | genesis, megadrive | +| Game Master | hartung | gmaster | +| Intellivision | intellivision | intellivision | +| J2ME | j2me | j2me | +| Atari Jaguar | jaguar | atarijaguar | +| Atari Lynx | lynx | atarilynx | +| Mac | mac | macintosh | +| Mega Duck/Cougar Boy | mega-duck-slash-cougar-boy | megaduck | +| Sega Model 2 | model2 | model2 | +| MSX | msx | msx, msx1 | +| MSX2 | msx2 | msx2 | +| MSX Turbo R | msx-turbo | msxturbor | +| MUGEN | mugen | mugen | +| Othello Multivision | multivision | multivision | +| Nintendo 64 | n64 | n64 | +| Nintendo 64DD | 64dd | n64dd | +| Nintendo DS | nds | nds | +| Neo Geo CD | neo-geo-cd | neogeocd, neogeocdjp | +| Neo Geo Pocket | neo-geo-pocket | ngp | +| Neo Geo Pocket Color | neo-geo-pocket-color | ngpc | +| Neo Geo AES | neogeoaes | neogeo | +| Nintendo Entertainment System | nes | nes | +| Nintendo GameCube | ngc | gc | +| Nintendo 3DS | 3ds | n3ds | +| Odyssey 2 | odyssey-2 | odyssey2 | +| OpenBOR | openbor | openbor | +| Palm OS | palm-os | palm | +| PC-8800 Series | pc-8800-series | pc88 | +| PC-9800 Series | pc-9800-series | pc98 | +| PC-FX | pc-fx | pcfx | +| Philips CD-i | philips-cd-i | cdimono1 | +| Pokémon mini | pokemon-mini | pokemini | +| PlayStation 2 | ps2 | ps2 | +| PlayStation 3 | ps3 | ps3 | +| PlayStation Portable | psp | psp | +| PlayStation Vita | psvita | psvita | +| PlayStation | psx | psx | +| Satellaview | satellaview | satellaview | +| Sega Saturn | saturn | saturn, saturnjp | +| ScummVM | scummvm | scummvm | +| Sega 32X | sega32 | sega32x, sega32xjp, sega32xna | +| Sega CD | segacd | megacd, megacdjp, segacd | +| Super Famicom | sfam | sfc | +| SG-1000 | sg1000 | sg-1000 | +| Sega Master System/Mark III | sms | mastersystem, mark3 | +| Sega ST-V | stv | stv | +| PC Engine SuperGrafx | supergrafx | supergrafx | +| Nintendo Switch | switch | switch | +| Commodore VIC-20 | vic-20 | vic20 | +| Virtual Boy | virtualboy | virtualboy | +| Wii | wii | wii | +| Wii U | wiiu | wiiu | +| WonderSwan | wonderswan | wonderswan | +| WonderSwan Color | wonderswan-color | wswanc | +| Sharp X1 | x1 | x1 | +| Sharp X68000 | sharp-x68000 | x68000 | +| Xbox | xbox | xbox | +| Sinclair ZX81 | zx81 | zx81 | +| ZX Spectrum | zxspectrum | zxspectrum | diff --git a/mkdocs.yml b/mkdocs.yml index 71ccb1b..d5cdd51 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -76,6 +76,7 @@ nav: - ROCKNIX: getting-started/install-rocknix.md - Spruce: getting-started/install-spruce.md - TrimUI: getting-started/install-trimui.md + - RetroDECK: getting-started/install-retrodeck.md - Usage: - User Guide: usage/guide.md - Settings Reference: usage/settings.md @@ -91,6 +92,7 @@ nav: - ROCKNIX: platforms/rocknix.md - Spruce: platforms/spruce.md - TrimUI: platforms/trimui.md + - RetroDECK: platforms/RETRODECK.md - Contributing: - contributing/index.md - Development Guide: contributing/development.md From 0969b2c7c369d15f4aef1c7bf66e063b39fb98e3 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:03:45 +0200 Subject: [PATCH 03/13] Automatic install with media --- docs/getting-started/install-retrodeck.md | 20 +++++++++++- scripts/RetroDECK/install.sh | 37 ++++++++++++++++++++++ scripts/RetroDECK/media/background.png | Bin 0 -> 45085 bytes scripts/RetroDECK/media/banner.png | Bin 0 -> 13936 bytes scripts/RetroDECK/media/cover.png | Bin 0 -> 15051 bytes scripts/RetroDECK/media/icon.png | Bin 0 -> 11572 bytes scripts/RetroDECK/media/logo.png | Bin 0 -> 12072 bytes taskfiles/package.yml | 3 +- 8 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 scripts/RetroDECK/install.sh create mode 100644 scripts/RetroDECK/media/background.png create mode 100644 scripts/RetroDECK/media/banner.png create mode 100644 scripts/RetroDECK/media/cover.png create mode 100644 scripts/RetroDECK/media/icon.png create mode 100644 scripts/RetroDECK/media/logo.png diff --git a/docs/getting-started/install-retrodeck.md b/docs/getting-started/install-retrodeck.md index 78e59cd..361b544 100644 --- a/docs/getting-started/install-retrodeck.md +++ b/docs/getting-started/install-retrodeck.md @@ -14,13 +14,31 @@ _Please help verify compatibility on other devices by reporting your results!_ ## Installation Steps +### Automatic (Recommended) + +Here is an all-in-one install script that will install Grout and add it as a non-Steam game. + +```bash +curl -o- https://raw.githubusercontent.com/rommapp/grout/refs/heads/main/scripts/RetroDECK/install.sh | bash +``` + +```bash +wget -qO- https://raw.githubusercontent.com/rommapp/grout/refs/heads/main/scripts/RetroDECK/install.sh | bash +``` + +### Manual + 1. Ensure your device has RetroDECK installed. 2. Download the [latest Grout release](https://github.com/rommapp/grout/releases/latest/download/Grout-RetroDECK.zip) for RetroDECK. 3. Unzip the downloaded archive. 4. Copy the `Grout` folder to your home directory (`/home/deck/grout/`) 5. Copy the `Grout.sh` file to the same Ports directory (`/home/deck/grout/Grout.sh`) -6. Open Steam and add Grout as a non-Steam game with this command: `/home/deck/grout/Grout.sh %command%` +6. Open Steam and add Grout as a non-Steam game: + - Target: `env` + - Start In: `/home/deck/grout/` + - Launch options: `/home/deck/grout/Grout.sh` + - You'll find game media in `/home/deck/grout/Grout/media/` 7. Launch Grout from Steam and enjoy! ## Update diff --git a/scripts/RetroDECK/install.sh b/scripts/RetroDECK/install.sh new file mode 100644 index 0000000..607a46e --- /dev/null +++ b/scripts/RetroDECK/install.sh @@ -0,0 +1,37 @@ +GROUT_VERSION=4.8.1.0 +GROUT_URL=https://github.com/rommapp/grout/releases/download/v$GROUT_VERSION/Grout-RetroDECK.zip + +NONSTEAM_VERSION=0.7.0 +NONSTEAM_URL=https://github.com/cameronhimself/nonsteam/releases/download/$NONSTEAM_VERSION/nonsteam-linux-x64-$NONSTEAM_VERSION.tar.gz + +echo "Creating installation directory..." +mkdir -p $HOME/grout && cd $HOME/grout +export PATH="$HOME/grout:$PATH" + +echo "Downloading and extracting Grout..." +curl -sL -o grout.zip $GROUT_URL +unzip -d . -o -qq grout.zip +rm grout.zip + +echo "Downloading and extracting nonsteam..." +curl -sL -o nonsteam.tgz $NONSTEAM_URL +tar -xzf nonsteam.tgz --strip-components=1 +rm nonsteam.tgz + +echo "Adding Grout as a non-Steam game..." +nonsteam add -w \ + --app-name "Grout" \ + --exe "env" \ + --start-dir "$HOME/grout/" \ + --launch-options "$HOME/grout/Grout.sh" \ + --image-icon "$HOME/grout/Grout/media/icon.png" \ + --image-grid "$HOME/grout/Grout/media/cover.png" \ + --image-grid-horiz "$HOME/grout/Grout/media/banner.png" \ + --image-hero "$HOME/grout/Grout/media/background.png" \ + --image-logo "$HOME/grout/Grout/media/logo.png" \ + --allow-overlay + +echo "Cleaning up..." +rm install.sh nonsteam + +echo "Done! Please restart Steam for changes to take effect." \ No newline at end of file diff --git a/scripts/RetroDECK/media/background.png b/scripts/RetroDECK/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5d5a1a1e2c2b47b4d22ae3989ff7f410988934 GIT binary patch literal 45085 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 k4B^ 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 Kg}q_*?0*56Al9w` literal 0 HcmV?d00001 diff --git a/scripts/RetroDECK/media/icon.png b/scripts/RetroDECK/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..808cfcb0afcfac81d668ac497b4643aac0de1941 GIT binary patch literal 11572 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 Y%`DA)sL2t0&**4+*3$U(X~doX0mcOKiU0rr literal 0 HcmV?d00001 diff --git a/taskfiles/package.yml b/taskfiles/package.yml index 3c100c8..a677598 100644 --- a/taskfiles/package.yml +++ b/taskfiles/package.yml @@ -138,8 +138,9 @@ tasks: retrodeck: cmds: - rm -rf dist/RetroDECK - - mkdir -p dist/RetroDECK/Grout/lib + - mkdir -p dist/RetroDECK/Grout/{lib,media} - cp scripts/RetroDECK/Grout.sh dist/RetroDECK/ + - cp scripts/RetroDECK/media/* dist/RetroDECK/Grout/media/ - cp build/grout README.md LICENSE dist/RetroDECK/Grout/ - cp -R build/lib/* dist/RetroDECK/Grout/lib/ - chmod a+x dist/RetroDECK/Grout/grout dist/RetroDECK/Grout.sh From 9cd82cb4835fb0573d25eb1a049b235571f73cc2 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:07:37 +0200 Subject: [PATCH 04/13] Fixed banner --- scripts/RetroDECK/media/banner.png | Bin 13936 -> 13870 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scripts/RetroDECK/media/banner.png b/scripts/RetroDECK/media/banner.png index 0828899a717a8539975a94c60f83b3c7e415b6ba..2e89752b1a4690e7ac611a1673e53833dec1c035 100644 GIT binary patch literal 13870 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 literal 13936 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 Date: Fri, 17 Apr 2026 13:08:28 +0200 Subject: [PATCH 05/13] Missing EOL --- scripts/RetroDECK/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/RetroDECK/install.sh b/scripts/RetroDECK/install.sh index 607a46e..b7d0d19 100644 --- a/scripts/RetroDECK/install.sh +++ b/scripts/RetroDECK/install.sh @@ -34,4 +34,4 @@ nonsteam add -w \ echo "Cleaning up..." rm install.sh nonsteam -echo "Done! Please restart Steam for changes to take effect." \ No newline at end of file +echo "Done! Please restart Steam for changes to take effect." From 3eeba8464a36bda4c9f605ea8150526be9665189 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:11:17 +0200 Subject: [PATCH 06/13] Copy a bit more libs --- scripts/RetroDECK/Grout.sh | 2 +- scripts/RetroDECK/install.sh | 2 +- taskfiles/build.yml | 50 ++++++++++++++++++++++-------------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/scripts/RetroDECK/Grout.sh b/scripts/RetroDECK/Grout.sh index 6d1217c..1ec0423 100644 --- a/scripts/RetroDECK/Grout.sh +++ b/scripts/RetroDECK/Grout.sh @@ -1,5 +1,5 @@ #!/bin/bash -CUR_DIR="$(dirname "$0")" +CUR_DIR="$(realpath "$(dirname "$0")")" cd "$CUR_DIR/Grout" || exit 1 # Apply pending update diff --git a/scripts/RetroDECK/install.sh b/scripts/RetroDECK/install.sh index b7d0d19..80ac601 100644 --- a/scripts/RetroDECK/install.sh +++ b/scripts/RetroDECK/install.sh @@ -32,6 +32,6 @@ nonsteam add -w \ --allow-overlay echo "Cleaning up..." -rm install.sh nonsteam +rm nonsteam echo "Done! Please restart Steam for changes to take effect." diff --git a/taskfiles/build.yml b/taskfiles/build.yml index f9363bc..bd5582c 100644 --- a/taskfiles/build.yml +++ b/taskfiles/build.yml @@ -22,8 +22,8 @@ tasks: - docker create --name {{.CONTAINER_NAME}}-{{.BUILD_DIR}} --label {{.LABEL}} {{.IMAGE_TAG}} >/dev/null 2>&1 - echo "Extracting {{.BUILD_DIR}}..." - docker cp {{.CONTAINER_NAME}}-{{.BUILD_DIR}}:/build/grout {{.BUILD_DIR}}/grout - - 'if [ -n "{{.GFX_PATH}}" ]; then docker cp {{.CONTAINER_NAME}}-{{.BUILD_DIR}}:{{.GFX_PATH}} {{.BUILD_DIR}}/lib/libSDL2_gfx-1.0.so.0; fi' - - 'if [ -n "{{.TTF_PATH}}" ]; then docker cp {{.CONTAINER_NAME}}-{{.BUILD_DIR}}:{{.TTF_PATH}} {{.BUILD_DIR}}/lib/libSDL2_ttf-2.0.so.0; fi' + - for: { var: LIBS } + cmd: docker cp -L {{.CONTAINER_NAME}}-{{.BUILD_DIR}}:{{.LIBS_PATH}}{{.ITEM}} {{.BUILD_DIR}}/lib/ - docker rm {{.CONTAINER_NAME}}-{{.BUILD_DIR}} >/dev/null 2>&1 - docker image prune --filter "label={{.LABEL}}" -f >/dev/null 2>&1 || true - echo "Extract {{.BUILD_DIR}} complete" @@ -36,11 +36,15 @@ tasks: - task: _build vars: { PLATFORM: linux/arm64, BUILD_DIR: build64, IMAGE_TAG: "{{.IMAGE_NAME}}-arm64", DOCKERFILE: docker/Dockerfile, LOCAL: "{{.LOCAL}}" } - task: _extract - vars: { - BUILD_DIR: build64, IMAGE_TAG: "{{.IMAGE_NAME}}-arm64", - GFX_PATH: /usr/lib/aarch64-linux-gnu/libSDL2_gfx-1.0.so.0.0.2, - TTF_PATH: /usr/lib/aarch64-linux-gnu/libSDL2_ttf-2.0.so.0.14.1 - } + vars: { BUILD_DIR: build, IMAGE_TAG: "{{.IMAGE_NAME}}-amd64", LIBS_PATH: "/usr/lib/aarch64-linux-gnu/", LIBS: [ + "libSDL2-2.0.so.0", + "libSDL2_image-2.0.so.0", + "libSDL2_gfx-1.0.so.0", + "libSDL2_ttf-2.0.so.0", + "libjpeg.so.62", + "libtiff.so.5", + "libwebp.so.6" + ],} amd64: desc: Build and extract for AMD64 (x86_64) @@ -48,11 +52,15 @@ tasks: - task: _build vars: { PLATFORM: linux/amd64, BUILD_DIR: build, IMAGE_TAG: "{{.IMAGE_NAME}}-amd64", DOCKERFILE: docker/Dockerfile } - task: _extract - vars: { - BUILD_DIR: build, IMAGE_TAG: "{{.IMAGE_NAME}}-amd64", - GFX_PATH: /usr/lib/x86_64-linux-gnu/libSDL2_gfx-1.0.so.0.0.2, - TTF_PATH: /usr/lib/x86_64-linux-gnu/libSDL2_ttf-2.0.so.0.14.1 - } + vars: { BUILD_DIR: build, IMAGE_TAG: "{{.IMAGE_NAME}}-amd64", LIBS_PATH: "/usr/lib/x86_64-linux-gnu/", LIBS: [ + "libSDL2-2.0.so.0", + "libSDL2_image-2.0.so.0", + "libSDL2_gfx-1.0.so.0", + "libSDL2_ttf-2.0.so.0", + "libjpeg.so.62", + "libtiff.so.5", + "libwebp.so.6" + ],} x86: desc: Build and extract for x86 (32-bit) @@ -60,11 +68,15 @@ tasks: - task: _build vars: { PLATFORM: linux/386, BUILD_DIR: buildx86, IMAGE_TAG: "{{.IMAGE_NAME}}-x86", DOCKERFILE: docker/Dockerfile } - task: _extract - vars: { - BUILD_DIR: buildx86, IMAGE_TAG: "{{.IMAGE_NAME}}-x86", - GFX_PATH: /usr/lib/i386-linux-gnu/libSDL2_gfx-1.0.so.0.0.2, - TTF_PATH: /usr/lib/i386-linux-gnu/libSDL2_ttf-2.0.so.0.14.1 - } + vars: { BUILD_DIR: build, IMAGE_TAG: "{{.IMAGE_NAME}}-amd64", LIBS_PATH: "/usr/lib/i386-linux-gnu/", LIBS: [ + "libSDL2-2.0.so.0", + "libSDL2_image-2.0.so.0", + "libSDL2_gfx-1.0.so.0", + "libSDL2_ttf-2.0.so.0", + "libjpeg.so.62", + "libtiff.so.5", + "libwebp.so.6" + ],} arm32: desc: Build and extract for ARM32 @@ -73,6 +85,6 @@ tasks: cmds: - task: _build vars: { PLATFORM: linux/arm/v7, BUILD_DIR: build32, IMAGE_TAG: "{{.IMAGE_NAME}}-arm32", DOCKERFILE: docker/32.Dockerfile, LOCAL: "{{.LOCAL}}" } - # TODO: add GFX_PATH and TTF_PATH once custom SDL build for Miyoo is ready + # TODO: add LIBS and LIBS_PATH once custom SDL build for Miyoo is ready - task: _extract - vars: { BUILD_DIR: build32, IMAGE_TAG: "{{.IMAGE_NAME}}-arm32", GFX_PATH: "", TTF_PATH: "" } + vars: { BUILD_DIR: build32, IMAGE_TAG: "{{.IMAGE_NAME}}-arm32", LIBS: [], LIBS_PATH: "" } From 5f5968a9b47a1921dd1028bae837ab760828b920 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Mon, 20 Apr 2026 14:54:49 +0200 Subject: [PATCH 07/13] Missing RetroDECK specific mappings --- cfw/directories.go | 23 +++++++++++++++++++++++ cfw/metadata.go | 2 +- cfw/platforms.go | 4 ++++ cfw/saves.go | 3 +++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/cfw/directories.go b/cfw/directories.go index 1488377..7f87bd9 100644 --- a/cfw/directories.go +++ b/cfw/directories.go @@ -8,6 +8,7 @@ import ( "grout/cfw/muos" "grout/cfw/nextui" "grout/cfw/onion" + "grout/cfw/retrodeck" "grout/cfw/rocknix" "grout/cfw/spruce" "grout/cfw/trimui" @@ -37,6 +38,8 @@ func GetRomDirectory() string { return batocera.GetRomDirectory() case MinUI: return minui.GetRomDirectory() + case RetroDECK: + return retrodeck.GetRomDirectory() } return "" } @@ -76,6 +79,8 @@ func GetBIOSDirectory() string { return batocera.GetBIOSDirectory() case MinUI: return minui.GetBIOSDirectory() + case RetroDECK: + return retrodeck.GetBIOSDirectory() } return "" } @@ -125,6 +130,8 @@ func GetArtDirectory(romDir string, platformFSSlug, platformName string) string return batocera.GetArtDirectory(romDir) case MinUI: return minui.GetArtDirectory(romDir) + case RetroDECK: + return retrodeck.GetArtDirectory(romDir) default: return "" } @@ -171,6 +178,8 @@ func BaseSavePath() string { return batocera.GetBaseSavePath() case MinUI: return minui.GetBaseSavePath() + case RetroDECK: + return retrodeck.GetBaseSavePath() } return "" } @@ -183,6 +192,8 @@ func GetArtMarqueeDirectory(romDir string, platformFSSlug, platformName string) return knulli.GetArtDirectory(romDir) case Batocera: return batocera.GetArtDirectory(romDir) + case RetroDECK: + return retrodeck.GetArtDirectory(romDir) default: return "" } @@ -196,6 +207,8 @@ func GetArtVideoDirectory(romDir string, platformFSSlug, platformName string) st return knulli.GetVideoDirectory(romDir) case Batocera: return batocera.GetVideoDirectory(romDir) + case RetroDECK: + return retrodeck.GetVideoDirectory(romDir) default: return "" @@ -210,6 +223,8 @@ func GetArtThumbnailDirectory(romDir string, platformFSSlug, platformName string return knulli.GetArtDirectory(romDir) case Batocera: return knulli.GetArtDirectory(romDir) + case RetroDECK: + return retrodeck.GetArtDirectory(romDir) default: return "" } @@ -223,6 +238,8 @@ func GetArtBezelDirectory(romDir string, platformFSSlug, platformName string) st return knulli.GetBezelDirectory(romDir) case Batocera: return batocera.GetBezelDirectory(romDir) + case RetroDECK: + return retrodeck.GetBezelDirectory(romDir) default: return "" } @@ -236,6 +253,8 @@ func GetManualDirectory(romDir string, platformFSSlug, platformName string) stri return knulli.GetManualDirectory(romDir) case Batocera: return batocera.GetManualDirectory(romDir) + case RetroDECK: + return retrodeck.GetManualDirectory(romDir) default: return "" } @@ -249,6 +268,8 @@ func GetBoxbackDirectory(romDir string, platformFSSlug, platformName string) str return knulli.GetArtDirectory(romDir) case Batocera: return batocera.GetArtDirectory(romDir) + case RetroDECK: + return retrodeck.GetArtDirectory(romDir) default: return "" } @@ -262,6 +283,8 @@ func GetFanartDirectory(romDir string, platformFSSlug, platformName string) stri return knulli.GetArtDirectory(romDir) case Batocera: return batocera.GetArtDirectory(romDir) + case RetroDECK: + return retrodeck.GetArtDirectory(romDir) default: return "" } diff --git a/cfw/metadata.go b/cfw/metadata.go index bde6916..84ca1a2 100644 --- a/cfw/metadata.go +++ b/cfw/metadata.go @@ -35,7 +35,7 @@ func AddGroutToGamelist(c CFW) { func FillGamesMetadata(entries []gamelist.RomGameEntry) { logger := gaba.GetLogger() switch GetCFW() { - case Knulli, ROCKNIX, Batocera: + case Knulli, ROCKNIX, Batocera, RetroDECK: if err := gamelist.AddRomGamesToGamelist(entries, gamelist.GameListFileName); err != nil { logger.Warn("Failed to add games to ES gamelist.xml", "error", err) } diff --git a/cfw/platforms.go b/cfw/platforms.go index 750eb58..c35b1ec 100644 --- a/cfw/platforms.go +++ b/cfw/platforms.go @@ -8,6 +8,7 @@ import ( "grout/cfw/muos" "grout/cfw/nextui" "grout/cfw/onion" + "grout/cfw/retrodeck" "grout/cfw/rocknix" "grout/cfw/spruce" "grout/cfw/trimui" @@ -31,6 +32,7 @@ func buildPlatformAliasMap() map[string][]string { onion.Platforms, batocera.Platforms, minui.Platforms, + retrodeck.Platforms, } // Build reverse map: primary folder -> list of RomM slugs that use it as primary @@ -134,6 +136,8 @@ func GetPlatformMap(c CFW) map[string][]string { return batocera.Platforms case MinUI: return minui.Platforms + case RetroDECK: + return retrodeck.Platforms default: return nil } diff --git a/cfw/saves.go b/cfw/saves.go index 7004881..68c5647 100644 --- a/cfw/saves.go +++ b/cfw/saves.go @@ -8,6 +8,7 @@ import ( "grout/cfw/muos" "grout/cfw/nextui" "grout/cfw/onion" + "grout/cfw/retrodeck" "grout/cfw/rocknix" "grout/cfw/spruce" "grout/cfw/trimui" @@ -37,6 +38,8 @@ func EmulatorFolderMap(c CFW) map[string][]string { return batocera.Platforms case MinUI: return minui.SaveDirectories + case RetroDECK: + return retrodeck.Platforms default: return nil } From bdc547eda664d902f7480c89aa8b2266fa09f38b Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Mon, 20 Apr 2026 14:55:08 +0200 Subject: [PATCH 08/13] Fix install script --- scripts/RetroDECK/install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/RetroDECK/install.sh b/scripts/RetroDECK/install.sh index 80ac601..352e06f 100644 --- a/scripts/RetroDECK/install.sh +++ b/scripts/RetroDECK/install.sh @@ -5,12 +5,13 @@ NONSTEAM_VERSION=0.7.0 NONSTEAM_URL=https://github.com/cameronhimself/nonsteam/releases/download/$NONSTEAM_VERSION/nonsteam-linux-x64-$NONSTEAM_VERSION.tar.gz echo "Creating installation directory..." -mkdir -p $HOME/grout && cd $HOME/grout +mkdir -p "$HOME/grout" && cd "$HOME/grout" export PATH="$HOME/grout:$PATH" echo "Downloading and extracting Grout..." curl -sL -o grout.zip $GROUT_URL unzip -d . -o -qq grout.zip +chmod +x Grout.sh Grout/grout rm grout.zip echo "Downloading and extracting nonsteam..." From 9e45124c35205bf14eb756024a9cfcb20e72ff42 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Mon, 20 Apr 2026 14:55:16 +0200 Subject: [PATCH 09/13] Add missing library for SteamOS --- taskfiles/build.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/taskfiles/build.yml b/taskfiles/build.yml index bd5582c..0937a0e 100644 --- a/taskfiles/build.yml +++ b/taskfiles/build.yml @@ -43,7 +43,8 @@ tasks: "libSDL2_ttf-2.0.so.0", "libjpeg.so.62", "libtiff.so.5", - "libwebp.so.6" + "libwebp.so.6", + "libjbig.so.0" ],} amd64: @@ -59,7 +60,8 @@ tasks: "libSDL2_ttf-2.0.so.0", "libjpeg.so.62", "libtiff.so.5", - "libwebp.so.6" + "libwebp.so.6", + "libjbig.so.0" ],} x86: @@ -75,7 +77,8 @@ tasks: "libSDL2_ttf-2.0.so.0", "libjpeg.so.62", "libtiff.so.5", - "libwebp.so.6" + "libwebp.so.6", + "libjbig.so.0" ],} arm32: From 00adbfeb8dd95587e9b59cf0295a4dafd5520206 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Mon, 20 Apr 2026 14:55:38 +0200 Subject: [PATCH 10/13] Fix platforms.json --- cfw/retrodeck/data/platforms.json | 158 +++++++++++++++++++++++------- 1 file changed, 125 insertions(+), 33 deletions(-) diff --git a/cfw/retrodeck/data/platforms.json b/cfw/retrodeck/data/platforms.json index b8b7736..808bf81 100644 --- a/cfw/retrodeck/data/platforms.json +++ b/cfw/retrodeck/data/platforms.json @@ -2,6 +2,12 @@ "3do": [ "3do" ], + "3ds": [ + "n3ds" + ], + "64dd": [ + "n64dd" + ], "acorn-archimedes": [ "archimedes" ], @@ -12,9 +18,7 @@ "amstradcpc" ], "amiga": [ - "amiga", - "amiga1200", - "amiga600" + "amiga" ], "amiga-cd32": [ "amigacd32" @@ -22,12 +26,12 @@ "amstrad-gx4000": [ "gx4000" ], - "appleii": [ - "apple2" - ], "apple-iigs": [ "apple2gs" ], + "appleii": [ + "apple2" + ], "arcade": [ "arcade" ], @@ -40,6 +44,9 @@ "astrocade": [ "astrocde" ], + "atari-st": [ + "atarist" + ], "atari2600": [ "atari2600" ], @@ -52,15 +59,19 @@ "atari800": [ "atari800" ], - "atari-st": [ - "atarist" - ], - "atari-xegs": [ + "atari8bit": [ + "atari800", "atarixe" ], "bbcmicro": [ "bbcmicro" ], + "c-plus-4": [ + "plus4" + ], + "c16": [ + "plus4" + ], "c64": [ "c64" ], @@ -76,9 +87,6 @@ "commodore-cdtv": [ "cdtv" ], - "c-plus-4": [ - "plus4" - ], "creativision": [ "crvision" ], @@ -88,15 +96,18 @@ "dos": [ "dos" ], + "dragon-32-slash-64": [ + "dragon32" + ], "epoch-super-cassette-vision": [ "scv" ], - "famicom": [ - "famicom" - ], "fairchild-channel-f": [ "channelf" ], + "famicom": [ + "famicom" + ], "fds": [ "fds" ], @@ -129,7 +140,8 @@ ], "genesis": [ "genesis", - "megadrive" + "megadrive", + "megadrivejp" ], "hartung": [ "gmaster" @@ -155,14 +167,19 @@ "model2": [ "model2" ], + "model3": [ + "model2" + ], "msx": [ - "msx", - "msx1" + "msx" + ], + "msx-turbo": [ + "msxturbor" ], "msx2": [ "msx2" ], - "msx-turbo": [ + "msx2plus": [ "msxturbor" ], "mugen": [ @@ -174,9 +191,6 @@ "n64": [ "n64" ], - "64dd": [ - "n64dd" - ], "nds": [ "nds" ], @@ -193,21 +207,27 @@ "neogeoaes": [ "neogeo" ], + "neogeomvs": [ + "neogeo" + ], "nes": [ "nes" ], + "new-nintendo-3ds": [ + "n3ds" + ], "ngc": [ "gc" ], - "3ds": [ - "n3ds" - ], "odyssey-2": [ "odyssey2" ], "openbor": [ "openbor" ], + "oric": [ + "oric" + ], "palm-os": [ "palm" ], @@ -217,12 +237,22 @@ "pc-9800-series": [ "pc98" ], + "pc-booter": [ + "pc" + ], + "pc-engine": [ + "pcengine", + "tg16" + ], "pc-fx": [ "pcfx" ], "philips-cd-i": [ "cdimono1" ], + "pico": [ + "pico8" + ], "pokemon-mini": [ "pokemini" ], @@ -257,57 +287,119 @@ "sega32xna" ], "segacd": [ - "megacd", - "megacdjp", "segacd" ], - "sfc": [ + "sfam": [ "sfc" ], "sg1000": [ "sg-1000" ], + "sharp-x68000": [ + "x68000" + ], "sms": [ "mastersystem", "mark3" ], + "snes": [ + "snes", + "snesna" + ], + "spectravideo": [ + "spectravideo" + ], "stv": [ "stv" ], + "sufami-turbo": [ + "sufami" + ], + "super-acan": [ + "supracan" + ], "supergrafx": [ "supergrafx" ], + "supervision": [ + "supervision" + ], "switch": [ "switch" ], + "tg16": [ + "tg16", + "pcengine" + ], + "thomson-mo5": [ + "moto" + ], + "thomson-to": [ + "moto", + "to8" + ], + "ti-99": [ + "ti99" + ], + "ti-994a": [ + "ti99" + ], + "to8": [ + "to8" + ], + "turbografx-cd": [ + "pcenginecd", + "tg-cd" + ], + "uzebox": [ + "uzebox" + ], + "vectrex": [ + "vectrex" + ], "vic-20": [ "vic20" ], "virtualboy": [ "virtualboy" ], + "vsmile": [ + "vsmile" + ], + "wasm-4": [ + "wasm4" + ], "wii": [ "wii" ], "wiiu": [ "wiiu" ], + "win": [ + "windows9x" + ], + "win3x": [ + "windows3x" + ], "wonderswan": [ "wonderswan" ], + "wonderswan-color": [ + "wonderswancolor" + ], "x1": [ "x1" ], - "sharp-x68000": [ - "x68000" - ], "xbox": [ "xbox" ], + "z-machine": [ + "zmachine" + ], "zx81": [ "zx81" ], - "zxspectrum": [ + "zxs": [ "zxspectrum" ] } From 84596e6a0094ab407f964652f39d35572500d7b6 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Mon, 20 Apr 2026 15:34:57 +0200 Subject: [PATCH 11/13] Update platforms --- cfw/retrodeck/data/platforms.json | 6 +- docs/platforms/RETRODECK.md | 231 +++++++++++++++++------------- 2 files changed, 132 insertions(+), 105 deletions(-) diff --git a/cfw/retrodeck/data/platforms.json b/cfw/retrodeck/data/platforms.json index 808bf81..06dffdc 100644 --- a/cfw/retrodeck/data/platforms.json +++ b/cfw/retrodeck/data/platforms.json @@ -60,7 +60,9 @@ "atari800" ], "atari8bit": [ - "atari800", + "atari8bit" + ], + "atari-xegs": [ "atarixe" ], "bbcmicro": [ @@ -180,7 +182,7 @@ "msx2" ], "msx2plus": [ - "msxturbor" + "msx2plus" ], "mugen": [ "mugen" diff --git a/docs/platforms/RETRODECK.md b/docs/platforms/RETRODECK.md index f5c7b79..5bc7c8a 100644 --- a/docs/platforms/RETRODECK.md +++ b/docs/platforms/RETRODECK.md @@ -2,106 +2,131 @@ This table shows the mappings of RomM Fs Slug to RetroDECK's platform folders. -| Platform Name | RomM Fs Slug | Folder(s) | -|-------------------------------|-----------------------------|-------------------------------| -| 3DO Interactive Multiplayer | 3do | 3do | -| Acorn Archimedes | acorn-archimedes | archimedes | -| Acorn Electron | acorn-electron | electron | -| Amstrad CPC | acpc | amstradcpc | -| Amiga | amiga | amiga, amiga1200, amiga600 | -| Amiga CD32 | amiga-cd32 | amigacd32 | -| Amstrad GX4000 | amstrad-gx4000 | gx4000 | -| Apple II | appleii | apple2 | -| Apple IIGS | apple-iigs | apple2gs | -| Arcade | arcade | arcade | -| Arcadia 2001 | arcadia-2001 | arcadia | -| Arduboy | arduboy | arduboy | -| Bally Astrocade | astrocade | astrocde | -| Atari 2600 | atari2600 | atari2600 | -| Atari 5200 | atari5200 | atari5200 | -| Atari 7800 | atari7800 | atari7800 | -| Atari 800 | atari800 | atari800 | -| Atari ST/STE | atari-st | atarist | -| Atari XEGS | atari-xegs | atarixe | -| BBC Microcomputer System | bbcmicro | bbcmicro | -| Commodore C64/128/MAX | c64 | c64 | -| Casio PV-1000 | casio-pv-1000 | pv1000 | -| Coleco Adam | colecoadam | adam | -| ColecoVision | colecovision | colecovision | -| Commodore CDTV | commodore-cdtv | cdtv | -| Commodore Plus/4 | c-plus-4 | plus4 | -| CreatiVision | creativision | crvision | -| Dreamcast | dc | dreamcast | -| DOS | dos | dos | -| Epoch Super Cassette Vision | epoch-super-cassette-vision | scv | -| Family Computer | famicom | famicom | -| Fairchild Channel F | fairchild-channel-f | channelf | -| Family Computer Disk System | fds | fds | -| FM-7 | fm-7 | fm7 | -| FM Towns | fm-towns | fmtowns | -| Game & Watch | g-and-w | gameandwatch | -| Gamate | gamate | gamate | -| Game.com | game-dot-com | gamecom | -| Sega Game Gear | gamegear | gamegear | -| Game Boy | gb | gb | -| Game Boy Advance | gba | gba | -| Game Boy Color | gbc | gbc | -| Sega Mega Drive/Genesis | genesis | genesis, megadrive | -| Game Master | hartung | gmaster | -| Intellivision | intellivision | intellivision | -| J2ME | j2me | j2me | -| Atari Jaguar | jaguar | atarijaguar | -| Atari Lynx | lynx | atarilynx | -| Mac | mac | macintosh | -| Mega Duck/Cougar Boy | mega-duck-slash-cougar-boy | megaduck | -| Sega Model 2 | model2 | model2 | -| MSX | msx | msx, msx1 | -| MSX2 | msx2 | msx2 | -| MSX Turbo R | msx-turbo | msxturbor | -| MUGEN | mugen | mugen | -| Othello Multivision | multivision | multivision | -| Nintendo 64 | n64 | n64 | -| Nintendo 64DD | 64dd | n64dd | -| Nintendo DS | nds | nds | -| Neo Geo CD | neo-geo-cd | neogeocd, neogeocdjp | -| Neo Geo Pocket | neo-geo-pocket | ngp | -| Neo Geo Pocket Color | neo-geo-pocket-color | ngpc | -| Neo Geo AES | neogeoaes | neogeo | -| Nintendo Entertainment System | nes | nes | -| Nintendo GameCube | ngc | gc | -| Nintendo 3DS | 3ds | n3ds | -| Odyssey 2 | odyssey-2 | odyssey2 | -| OpenBOR | openbor | openbor | -| Palm OS | palm-os | palm | -| PC-8800 Series | pc-8800-series | pc88 | -| PC-9800 Series | pc-9800-series | pc98 | -| PC-FX | pc-fx | pcfx | -| Philips CD-i | philips-cd-i | cdimono1 | -| Pokémon mini | pokemon-mini | pokemini | -| PlayStation 2 | ps2 | ps2 | -| PlayStation 3 | ps3 | ps3 | -| PlayStation Portable | psp | psp | -| PlayStation Vita | psvita | psvita | -| PlayStation | psx | psx | -| Satellaview | satellaview | satellaview | -| Sega Saturn | saturn | saturn, saturnjp | -| ScummVM | scummvm | scummvm | -| Sega 32X | sega32 | sega32x, sega32xjp, sega32xna | -| Sega CD | segacd | megacd, megacdjp, segacd | -| Super Famicom | sfam | sfc | -| SG-1000 | sg1000 | sg-1000 | -| Sega Master System/Mark III | sms | mastersystem, mark3 | -| Sega ST-V | stv | stv | -| PC Engine SuperGrafx | supergrafx | supergrafx | -| Nintendo Switch | switch | switch | -| Commodore VIC-20 | vic-20 | vic20 | -| Virtual Boy | virtualboy | virtualboy | -| Wii | wii | wii | -| Wii U | wiiu | wiiu | -| WonderSwan | wonderswan | wonderswan | -| WonderSwan Color | wonderswan-color | wswanc | -| Sharp X1 | x1 | x1 | -| Sharp X68000 | sharp-x68000 | x68000 | -| Xbox | xbox | xbox | -| Sinclair ZX81 | zx81 | zx81 | -| ZX Spectrum | zxspectrum | zxspectrum | +| Platform Name | RomM Fs Slug | Folder(s) | +|----------------------------------|-----------------------------|---------------------------------| +| 3DO Interactive Multiplayer | 3do | 3do | +| Acorn Archimedes | acorn-archimedes | archimedes | +| Acorn Computers BBC Micro | bbcmicro | bbcmicro | +| Acorn Electron | acorn-electron | electron | +| Amstrad CPC | acpc | amstradcpc | +| Amstrad GX4000 | amstrad-gx4000 | gx4000 | +| Apple II | appleii | apple2 | +| Apple IIGS | apple-iigs | apple2gs | +| Apple Macintosh | mac | macintosh | +| Arcade | arcade | arcade | +| Arduboy Miniature Game System | arduboy | arduboy | +| Atari 2600 | atari2600 | atari2600 | +| Atari 5200 | atari5200 | atari5200 | +| Atari 7800 ProSystem | atari7800 | atari7800 | +| Atari 800 | atari800 | atari800 | +| Atari Jaguar | jaguar | atarijaguar | +| Atari Lynx | lynx | atarilynx | +| Atari ST | atari-st | atarist | +| Atari XE | atari-xegs | atarixe | +| Bally Astrocade | astrocade | astrocde | +| Bandai SuFami Turbo | sufami-turbo | sufami | +| Bandai WonderSwan | wonderswan | wonderswan | +| Bandai WonderSwan Color | wonderswan-color | wonderswancolor | +| Bit Corporation Gamate | gamate | gamate | +| Casio PV-1000 | casio-pv-1000 | pv1000 | +| Coleco Adam | colecoadam | adam | +| Coleco ColecoVision | colecovision | colecovision | +| Commodore 64 | c64 | c64 | +| Commodore Amiga | amiga | amiga | +| Commodore Amiga CD32 | amiga-cd32 | amigacd32 | +| Commodore CDTV | commodore-cdtv | cdtv | +| Commodore Plus/4 | c-plus-4, c16 | plus4 | +| Commodore VIC-20 | vic-20 | vic20 | +| Creatronic Mega Duck | mega-duck-slash-cougar-boy | megaduck | +| DOS (PC) | dos | dos | +| Dragon Data Dragon 32 | dragon-32-slash-64 | dragon32 | +| Emerson Arcadia 2001 | arcadia-2001 | arcadia | +| Epoch Super Cassette Vision | epoch-super-cassette-vision | scv | +| Fairchild Channel F | fairchild-channel-f | channelf | +| Fujitsu FM Towns | fm-towns | fmtowns | +| Fujitsu FM-7 | fm-7 | fm7 | +| Funtech Super A'Can | super-acan | supracan | +| GCE Vectrex | vectrex | vectrex | +| Hartung Game Master | hartung | gmaster | +| IBM PC | pc-booter | pc | +| Infocom Z-machine | z-machine | zmachine | +| Java 2 Micro Edition (J2ME) | j2me | j2me | +| M.U.G.E.N Game Engine | mugen | mugen | +| Magnavox Odyssey 2 | odyssey-2 | odyssey2 | +| Mattel Electronics Intellivision | intellivision | intellivision | +| Microsoft Windows 3.x | win3x | windows3x | +| Microsoft Windows 9x | win | windows9x | +| Microsoft Xbox | xbox | xbox | +| MSX | msx | msx | +| MSX Turbo R | msx-turbo | msxturbor | +| MSX2 | msx2 | msx2 | +| NEC PC Engine | pc-engine | pcengine, tg16 | +| NEC PC Engine CD | turbografx-cd | pcenginecd, tg-cd | +| NEC PC-8800 Series | pc-8800-series | pc88 | +| NEC PC-9800 Series | pc-9800-series | pc98 | +| NEC PC-FX | pc-fx | pcfx | +| NEC SuperGrafx | supergrafx | supergrafx | +| NEC TurboGrafx-16 | tg16 | tg16, pcengine | +| Nintendo 3DS | 3ds, new-nintendo-3ds | n3ds | +| Nintendo 64 | n64 | n64 | +| Nintendo 64DD | 64dd | n64dd | +| Nintendo DS | nds | nds | +| Nintendo Entertainment System | nes | nes | +| Nintendo Famicom Disk System | fds | fds | +| Nintendo Family Computer | famicom | famicom | +| Nintendo Game and Watch | g-and-w | gameandwatch | +| Nintendo Game Boy | gb | gb | +| Nintendo Game Boy Advance | gba | gba | +| Nintendo Game Boy Color | gbc | gbc | +| Nintendo GameCube | ngc | gc | +| Nintendo Pokémon Mini | pokemon-mini | pokemini | +| Nintendo Satellaview | satellaview | satellaview | +| Nintendo SFC (Super Famicom) | sfam | sfc | +| Nintendo SNES (Super Nintendo) | snes | snes, snesna | +| Nintendo Switch | switch | switch | +| Nintendo Virtual Boy | virtualboy | virtualboy | +| Nintendo Wii | wii | wii | +| Nintendo Wii U | wiiu | wiiu | +| OpenBOR Game Engine | openbor | openbor | +| Othello Multivision | multivision | multivision | +| Palm OS | palm-os | palm | +| Philips CD-i | philips-cd-i | cdimono1 | +| PICO-8 Fantasy Console | pico | pico8 | +| ScummVM Game Engine | scummvm | scummvm | +| Sega CD | segacd | segacd | +| Sega Dreamcast | dc | dreamcast | +| Sega Game Gear | gamegear | gamegear | +| Sega Genesis | genesis | genesis, megadrive, megadrivejp | +| Sega Master System | sms | mastersystem, mark3 | +| Sega Mega Drive 32X | sega32 | sega32x, sega32xjp, sega32xna | +| Sega Model 2 | model2, model3 | model2 | +| Sega Saturn | saturn | saturn, saturnjp | +| Sega SG-1000 | sg1000 | sg-1000 | +| Sega Titan Video Game System | stv | stv | +| Sharp X1 | x1 | x1 | +| Sharp X68000 | sharp-x68000 | x68000 | +| Sinclair ZX Spectrum | zxs | zxspectrum | +| Sinclair ZX81 | zx81 | zx81 | +| SNK Neo Geo | neogeoaes, neogeomvs | neogeo | +| SNK Neo Geo CD | neo-geo-cd | neogeocd, neogeocdjp | +| SNK Neo Geo Pocket | neo-geo-pocket | ngp | +| SNK Neo Geo Pocket Color | neo-geo-pocket-color | ngpc | +| Sony PlayStation | psx | psx | +| Sony PlayStation 2 | ps2 | ps2 | +| Sony PlayStation 3 | ps3 | ps3 | +| Sony PlayStation Portable | psp | psp | +| Sony PlayStation Vita | psvita | psvita | +| Spectravideo | spectravideo | spectravideo | +| Tangerine Computer Systems Oric | oric | oric | +| Texas Instruments TI-99 | ti-99, ti-994a | ti99 | +| Thomson MO/TO Series | thomson-mo5 | moto | +| Thomson MO/TO Series | thomson-to | moto, to8 | +| Thomson TO8 | to8 | to8 | +| Tiger Electronics Game.com | game-dot-com | gamecom | +| Unknown | atari8bit | atari8bit | +| Unknown | msx2plus | msx2plus | +| Uzebox Open Source Console | uzebox | uzebox | +| VTech CreatiVision | creativision | crvision | +| VTech V.Smile | vsmile | vsmile | +| WASM-4 Fantasy Console | wasm-4 | wasm4 | +| Watara Supervision | supervision | supervision | \ No newline at end of file From 32628f97b6b85aeb66ee63e55413cfc903d7282d Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Mon, 20 Apr 2026 17:20:59 +0200 Subject: [PATCH 12/13] Revert useless stuff --- cfw/metadata.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cfw/metadata.go b/cfw/metadata.go index 84ca1a2..bde6916 100644 --- a/cfw/metadata.go +++ b/cfw/metadata.go @@ -35,7 +35,7 @@ func AddGroutToGamelist(c CFW) { func FillGamesMetadata(entries []gamelist.RomGameEntry) { logger := gaba.GetLogger() switch GetCFW() { - case Knulli, ROCKNIX, Batocera, RetroDECK: + case Knulli, ROCKNIX, Batocera: if err := gamelist.AddRomGamesToGamelist(entries, gamelist.GameListFileName); err != nil { logger.Warn("Failed to add games to ES gamelist.xml", "error", err) } From ed309546006d9fe37b97993d21399c1cb5ab5f16 Mon Sep 17 00:00:00 2001 From: Julien Loir <6706489+Namaneo@users.noreply.github.com> Date: Mon, 20 Apr 2026 17:34:28 +0200 Subject: [PATCH 13/13] L2 for Menu --- ui/games_list.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ui/games_list.go b/ui/games_list.go index 3cd0af5..79aeb2b 100644 --- a/ui/games_list.go +++ b/ui/games_list.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "grout/cache" + "grout/cfw" "grout/internal" "grout/internal/environment" "grout/internal/stringutil" @@ -260,7 +261,11 @@ func (s *GameListScreen) Draw(input GameListInput) (GameListOutput, error) { options.SecondaryActionButton = gabaconst.VirtualButtonY if hasBIOS && !internal.IsKidModeEnabled() { - options.TertiaryActionButton = gabaconst.VirtualButtonMenu + if environment.IsMiyoo() || cfw.GetCFW() == cfw.RetroDECK { + options.TertiaryActionButton = gabaconst.VirtualButtonL2 + } else { + options.TertiaryActionButton = gabaconst.VirtualButtonMenu + } } var footerItems []gaba.FooterHelpItem @@ -269,7 +274,7 @@ func (s *GameListScreen) Draw(input GameListInput) (GameListOutput, error) { if hasBIOS && !internal.IsKidModeEnabled() { menuButtonName := i18n.Localize(&goi18n.Message{ID: "button_menu", Other: "Menu"}, nil) - if environment.IsMiyoo() { + if environment.IsMiyoo() || cfw.GetCFW() == cfw.RetroDECK { menuButtonName = "L2" } footerItems = append(footerItems, gaba.FooterHelpItem{ButtonName: menuButtonName, HelpText: i18n.Localize(&goi18n.Message{ID: "button_bios", Other: "BIOS"}, nil)})