From bdc6a5d214f52bfb08a0a0f9ee8235463d44c468 Mon Sep 17 00:00:00 2001 From: purian23 Date: Tue, 20 Oct 2026 02:38:30 -0400 Subject: [PATCH] feat(PikaOS): add official support & installer options Fixes #2772 --- core/cmd/dms/commands_greeter.go | 4 +++ core/internal/distros/debian.go | 8 +++++ core/internal/distros/pika.go | 50 ++++++++++++++++++++++++++++++ core/internal/distros/pika_test.go | 33 ++++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 core/internal/distros/pika.go create mode 100644 core/internal/distros/pika_test.go diff --git a/core/cmd/dms/commands_greeter.go b/core/cmd/dms/commands_greeter.go index 371d787da..afd41ef2b 100644 --- a/core/cmd/dms/commands_greeter.go +++ b/core/cmd/dms/commands_greeter.go @@ -53,6 +53,10 @@ func greeterPackageInstallHint() string { return "Install package: dms-greeter" } + if config.ID == "pika" { + return "Install with 'sudo apt install dms-greeter'" + } + switch config.Family { case distros.FamilyDebian: return "Install with 'sudo apt install dms-greeter' (requires DankLinux OBS repo — see " + site.Docs + "/dankgreeter/installation#debian)" diff --git a/core/internal/distros/debian.go b/core/internal/distros/debian.go index 7aac80cbc..9cb0f52f4 100644 --- a/core/internal/distros/debian.go +++ b/core/internal/distros/debian.go @@ -70,6 +70,11 @@ func (d *DebianDistribution) DetectDependenciesWithTerminal(ctx context.Context, dependencies = append(dependencies, d.detectXwaylandSatellite()) } + if wm == deps.WindowManagerHyprland && d.isPika() { + dependencies = append(dependencies, d.detectHyprlandTools()...) + dependencies = append(dependencies, d.detectHyprlandGuiutils()) + } + dependencies = append(dependencies, d.detectMatugen()) dependencies = append(dependencies, d.detectDanksearch()) dependencies = append(dependencies, withGitVariant(d.detectDankCalendar(), d.packageInstalled("dankcalendar-git"))) @@ -140,6 +145,9 @@ func (d *DebianDistribution) GetPackageMapping(wm deps.WindowManager) map[string } func (d *DebianDistribution) GetPackageMappingWithVariants(wm deps.WindowManager, variants map[string]deps.PackageVariant) map[string]PackageMapping { + if d.isPika() { + return d.pikaPackageMapping(wm, variants) + } packages := map[string]PackageMapping{ // Standard APT packages "git": {Name: "git", Repository: RepoTypeSystem}, diff --git a/core/internal/distros/pika.go b/core/internal/distros/pika.go new file mode 100644 index 000000000..5c017e3d9 --- /dev/null +++ b/core/internal/distros/pika.go @@ -0,0 +1,50 @@ +package distros + +import ( + "github.com/AvengeMedia/DankMaterialShell/core/internal/deps" +) + +// PikaOS carries the whole DMS stack in its own apt repo, so no OBS repos or backports. +func init() { + Register("pika", "#FFDE34", FamilyDebian, func(config DistroConfig, logChan chan<- string) Distribution { + return NewDebianDistribution(config, logChan) + }) +} + +func (d *DebianDistribution) isPika() bool { + return d.config.ID == "pika" +} + +func (d *DebianDistribution) pikaPackageMapping(wm deps.WindowManager, variants map[string]deps.PackageVariant) map[string]PackageMapping { + system := func(name string) PackageMapping { + return PackageMapping{Name: name, Repository: RepoTypeSystem} + } + packages := map[string]PackageMapping{ + "git": system("git"), + "kitty": system("kitty"), + "alacritty": system("alacritty"), + "ghostty": system("ghostty"), + "xdg-desktop-portal-gtk": system("xdg-desktop-portal-gtk"), + "accountsservice": system("accountsservice"), + "dms (DankMaterialShell)": variantMapping("dms", variants["dms (DankMaterialShell)"], RepoTypeSystem, ""), + "quickshell": variantMapping("quickshell", variants["quickshell"], RepoTypeSystem, ""), + "dms-greeter": variantMapping("dms-greeter", variants["dms-greeter"], RepoTypeSystem, ""), + "matugen": system("matugen"), + "danksearch": system("danksearch"), + "dankcalendar": variantMapping("dankcalendar", variants["dankcalendar"], RepoTypeSystem, ""), + } + + switch wm { + case deps.WindowManagerHyprland: + packages["hyprland"] = system("hyprland") + packages["hyprctl"] = system("hyprland") + packages["jq"] = system("jq") + // Debian's hyprland-guiutils breaks the hyprland-qtutils PikaOS's hyprland depends on. + packages["hyprland-guiutils"] = system("hyprland-qtutils") + case deps.WindowManagerNiri: + packages["niri"] = variantMapping("niri", variants["niri"], RepoTypeSystem, "") + packages["xwayland-satellite"] = variantMapping("xwayland-satellite", variants["niri"], RepoTypeSystem, "") + } + + return packages +} diff --git a/core/internal/distros/pika_test.go b/core/internal/distros/pika_test.go new file mode 100644 index 000000000..01fc5ac28 --- /dev/null +++ b/core/internal/distros/pika_test.go @@ -0,0 +1,33 @@ +package distros + +import ( + "testing" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/deps" +) + +func TestPikaPackageMapping_SystemRepoOnly(t *testing.T) { + d := NewDebianDistribution(Registry["pika"], nil) + variants := map[string]deps.PackageVariant{ + "quickshell": deps.VariantGit, + "dms (DankMaterialShell)": deps.VariantGit, + } + for _, wm := range []deps.WindowManager{deps.WindowManagerNiri, deps.WindowManagerHyprland} { + packages := d.GetPackageMappingWithVariants(wm, variants) + for name, pkg := range packages { + if pkg.Repository != RepoTypeSystem { + t.Errorf("%v: pika maps %s to %s, want system repo", wm, name, pkg.Repository) + } + } + if packages["dms (DankMaterialShell)"].Name != "dms-git" { + t.Errorf("%v: dms git variant = %s, want dms-git", wm, packages["dms (DankMaterialShell)"].Name) + } + } + hypr := d.GetPackageMapping(deps.WindowManagerHyprland) + if _, ok := hypr["hyprland"]; !ok { + t.Error("pika offers hyprland but maps no package for it") + } + if hypr["hyprland-guiutils"].Name != "hyprland-qtutils" { + t.Errorf("hyprland-guiutils = %s, want hyprland-qtutils", hypr["hyprland-guiutils"].Name) + } +}