Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -140,19 +140,21 @@ 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:esde

- name: Create distribution
- name: Create distributions
run: |
cd dist/Batocera-amd64 && zip -r ../Grout-Batocera-amd64.zip Grout.sh Grout
cd dist/Batocera-amd64 && zip -r ../Grout-Batocera-amd64.zip Grout.sh Grout && cd ../..
cd dist/ESDE && zip -r ../Grout-ESDE.zip Grout.sh Grout && cd ../..

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: amd64-artifacts
path: |
dist/Grout-Batocera-amd64.zip
dist/Grout-ESDE.zip

build-x86:
needs: prepare
Expand Down Expand Up @@ -306,6 +308,7 @@ jobs:
**/Grout-Batocera-arm64.zip
**/Grout-Batocera-x86.zip
**/Grout-Batocera-amd64.zip
**/Grout-ESDE.zip
**/grout
draft: false
prerelease: ${{ inputs.beta }}
Expand Down Expand Up @@ -383,6 +386,7 @@ jobs:
"Grout-Batocera-arm64.zip"
"Grout-Batocera-amd64.zip"
"Grout-Batocera-x86.zip"
"Grout-ESDE.zip"
)

# Build the assets JSON object
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
A RomM Client for your retro doo-dad.
</h3>

[Allium][allium] · [Batocera][batocera] · [Knulli][knulli] · [Koriki][koriki] · [MinUI][minui] · [muOS][muos] · [NextUI][nextui] · [Onion][onion] · [ROCKNIX][rocknix] · [Spruce][spruce] · [SprigUI][sprigui] · [TwigUI][twigui] · [TrimUI][trimui]
[Allium][allium] · [Batocera][batocera] · [EmuDeck / ES-DE][emudeck] · [Knulli][knulli] · [Koriki][koriki] · [MinUI][minui] · [muOS][muos] · [NextUI][nextui] · [Onion][onion] · [ROCKNIX][rocknix] · [Spruce][spruce] · [SprigUI][sprigui] · [TwigUI][twigui] · [TrimUI][trimui]

<br>

Expand Down Expand Up @@ -88,6 +88,8 @@ If you enjoy using Grout and feel inclined to pay it forward, go do something ni

[allium]: https://github.com/goweiwen/Allium
[batocera]: https://batocera.org
[emudeck]: https://www.emudeck.com
[es-de]: https://es-de.org
[knulli]: https://knulli.org
[koriki]: https://github.com/Rparadise-Team/Koriki
[minui]: https://github.com/shauninman/MinUI
Expand Down
28 changes: 28 additions & 0 deletions app/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ import (
"log/slog"
"os"
"path/filepath"
"strings"
"time"

gaba "github.com/BrandonKowalski/gabagool/v2/pkg/gabagool"
buttons "github.com/BrandonKowalski/gabagool/v2/pkg/gabagool/constants"
"github.com/BrandonKowalski/gabagool/v2/pkg/gabagool/i18n"
goi18n "github.com/nicksnyder/go-i18n/v2/i18n"
"github.com/veandco/go-sdl2/sdl"
)

type SetupResult struct {
Expand Down Expand Up @@ -58,6 +60,24 @@ func setup() SetupResult {
}
}

func isSteamDeckHardware() bool {
for _, path := range []string{
"/sys/class/dmi/id/product_name",
"/sys/class/dmi/id/product_version",
"/sys/class/dmi/id/board_name",
} {
data, err := os.ReadFile(path)
if err != nil {
continue
}
value := strings.ToLower(strings.TrimSpace(string(data)))
if strings.Contains(value, "steam deck") || strings.Contains(value, "jupiter") || strings.Contains(value, "galileo") {
return true
}
}
return false
}

func setupInputMapping(currentCFW cfw.CFW) {
cwd, err := os.Getwd()
if err != nil {
Expand Down Expand Up @@ -126,6 +146,14 @@ func initFramework(currentCFW cfw.CFW) {
}
gaba.Init(gabaOptions)

if currentCFW == cfw.ESDE || isSteamDeckHardware() {
// Steam Deck/Steam Input can emit continuous tiny analog-stick motion events,
// which flood SDL's event queue and make button input appear delayed or jittery.
// D-pad/buttons are sufficient for Grout navigation, so drop axis motion events.
sdl.EventState(sdl.CONTROLLERAXISMOTION, sdl.IGNORE)
sdl.EventState(sdl.JOYAXISMOTION, sdl.IGNORE)
}

gaba.RegisterChord("unlock-kid-mode", []buttons.VirtualButton{
buttons.VirtualButtonL1,
buttons.VirtualButtonR1,
Expand Down
7 changes: 4 additions & 3 deletions cfw/cfw.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const (
Onion CFW = "ONION"
Koriki CFW = "KORIKI"
Batocera CFW = "BATOCERA"
ESDE CFW = "ESDE"
MinUI CFW = "MINUI"
)

Expand All @@ -27,18 +28,18 @@ func GetCFW() CFW {
cfw := CFW(cfwEnv)

switch cfw {
case MuOS, NextUI, Knulli, Spruce, ROCKNIX, Trimui, Allium, Onion, Koriki, Batocera, MinUI:
case MuOS, NextUI, Knulli, Spruce, ROCKNIX, Trimui, Allium, Onion, Koriki, Batocera, ESDE, MinUI:
return cfw
default:
log.SetOutput(os.Stderr)
log.Fatalf("Unsupported CFW: '%s'. Valid options: NextUI, muOS, Knulli, Spruce, ROCKNIX, Trimui, Allium, Onion, Koriki, Batocera, MinUI", cfwEnv)
log.Fatalf("Unsupported CFW: '%s'. Valid options: NextUI, muOS, Knulli, Spruce, ROCKNIX, Trimui, Allium, Onion, Koriki, Batocera, ESDE, MinUI", cfwEnv)
return ""
}
}

func (c CFW) IsBasedOnEmulationStation() bool {
switch c {
case Knulli, ROCKNIX, Batocera:
case Knulli, ROCKNIX, Batocera, ESDE:
return true
default:
return false
Expand Down
23 changes: 23 additions & 0 deletions cfw/directories.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cfw
import (
"grout/cfw/allium"
"grout/cfw/batocera"
"grout/cfw/esde"
"grout/cfw/knulli"
"grout/cfw/koriki"
"grout/cfw/minui"
Expand Down Expand Up @@ -38,6 +39,8 @@ func GetRomDirectory() string {
return koriki.GetRomDirectory()
case Batocera:
return batocera.GetRomDirectory()
case ESDE:
return esde.GetRomDirectory()
case MinUI:
return minui.GetRomDirectory()
}
Expand Down Expand Up @@ -79,6 +82,8 @@ func GetBIOSDirectory() string {
return koriki.GetBIOSDirectory()
case Batocera:
return batocera.GetBIOSDirectory()
case ESDE:
return esde.GetBIOSDirectory()
case MinUI:
return minui.GetBIOSDirectory()
}
Expand Down Expand Up @@ -130,6 +135,8 @@ func GetArtDirectory(romDir string, platformFSSlug, platformName string) string
return koriki.GetArtDirectory(romDir)
case Batocera:
return batocera.GetArtDirectory(romDir)
case ESDE:
return esde.GetArtDirectory(romDir)
case MinUI:
return minui.GetArtDirectory(romDir)
default:
Expand Down Expand Up @@ -178,6 +185,8 @@ func BaseSavePath() string {
return koriki.GetBaseSavePath()
case Batocera:
return batocera.GetBaseSavePath()
case ESDE:
return esde.GetBaseSavePath()
case MinUI:
return minui.GetBaseSavePath()
}
Expand All @@ -192,6 +201,8 @@ func GetArtMarqueeDirectory(romDir string, platformFSSlug, platformName string)
return knulli.GetArtDirectory(romDir)
case Batocera:
return batocera.GetArtDirectory(romDir)
case ESDE:
return esde.GetArtDirectory(romDir)
default:
return ""
}
Expand All @@ -205,6 +216,8 @@ func GetArtVideoDirectory(romDir string, platformFSSlug, platformName string) st
return knulli.GetVideoDirectory(romDir)
case Batocera:
return batocera.GetVideoDirectory(romDir)
case ESDE:
return esde.GetVideoDirectory(romDir)
default:
return ""

Expand All @@ -219,6 +232,8 @@ func GetArtThumbnailDirectory(romDir string, platformFSSlug, platformName string
return knulli.GetArtDirectory(romDir)
case Batocera:
return knulli.GetArtDirectory(romDir)
case ESDE:
return esde.GetArtDirectory(romDir)
default:
return ""
}
Expand All @@ -232,6 +247,8 @@ func GetArtBezelDirectory(romDir string, platformFSSlug, platformName string) st
return knulli.GetBezelDirectory(romDir)
case Batocera:
return batocera.GetBezelDirectory(romDir)
case ESDE:
return esde.GetBezelDirectory(romDir)
default:
return ""
}
Expand All @@ -245,6 +262,8 @@ func GetManualDirectory(romDir string, platformFSSlug, platformName string) stri
return knulli.GetManualDirectory(romDir)
case Batocera:
return batocera.GetManualDirectory(romDir)
case ESDE:
return esde.GetManualDirectory(romDir)
default:
return ""
}
Expand All @@ -258,6 +277,8 @@ func GetBoxbackDirectory(romDir string, platformFSSlug, platformName string) str
return knulli.GetArtDirectory(romDir)
case Batocera:
return batocera.GetArtDirectory(romDir)
case ESDE:
return esde.GetArtDirectory(romDir)
default:
return ""
}
Expand All @@ -271,6 +292,8 @@ func GetFanartDirectory(romDir string, platformFSSlug, platformName string) stri
return knulli.GetArtDirectory(romDir)
case Batocera:
return batocera.GetArtDirectory(romDir)
case ESDE:
return esde.GetArtDirectory(romDir)
default:
return ""
}
Expand Down
Loading