Files
magpie/internal/gui/scheme_linux.go
T

48 lines
1.3 KiB
Go

package gui
import (
"os"
"path/filepath"
"strings"
"github.com/yetone/magpie/internal/proc"
)
// registerScheme makes magpie:// links open this executable: a desktop
// entry that claims the scheme, then the desktop's default for it. An
// entry that already runs this executable and claims it is left alone.
func registerScheme() error {
exe, err := os.Executable()
if err != nil {
return err
}
data := os.Getenv("XDG_DATA_HOME")
if data == "" {
home, _ := os.UserHomeDir()
data = filepath.Join(home, ".local", "share")
}
dir := filepath.Join(data, "applications")
path := filepath.Join(dir, "magpie.desktop")
entry := `[Desktop Entry]
Type=Application
Name=magpie
Comment=Every agent's model. One place.
Exec=` + exe + ` %u
Icon=magpie
Categories=Development;Utility;
MimeType=x-scheme-handler/magpie;
Terminal=false
`
if old, err := os.ReadFile(path); err == nil && strings.Contains(string(old), "Exec="+exe+" %u") && strings.Contains(string(old), "x-scheme-handler/magpie") {
return nil
}
if err := os.MkdirAll(dir, 0o755); err != nil {
return err
}
if err := os.WriteFile(path, []byte(entry), 0o644); err != nil {
return err
}
_ = proc.Command("update-desktop-database", dir).Run()
return proc.Command("xdg-mime", "default", "magpie.desktop", "x-scheme-handler/magpie").Run()
}