LazyRun v1.0.0: shortcut maker untuk executable dan PWA

- Fungsi A: shortcut dari file executable (ELF/AppImage/script)
- Fungsi B: shortcut PWA/URL dengan deteksi browser (native, /opt, Flatpak)
- Checkbox Menu Aplikasi / Desktop, desktop-only pakai NoDisplay=true
- List + uninstall + deteksi shortcut yang file .desktop-nya hilang
- Metadata ~/.config/lazyrun/shortcuts.json, refresh cache XDG/KDE
- AppImage + zsync update info via build.sh
This commit is contained in:
oxpoe committed 2026-10-13 08:00:12 +07:00
1 parent 9cd5a1f82d
commit da31f7d7d7
31 files changed
+2916

No files matched your search

+54
View File
@@ -0,0 +1,54 @@
// Package xdg menghitung path XDG yang dipakai LazyRun.
package xdg
import (
"os"
"os/exec"
"path/filepath"
"strings"
)
func home() string {
h, _ := os.UserHomeDir()
return h
}
func dataHome() string {
if v := os.Getenv("XDG_DATA_HOME"); v != "" {
return v
}
return filepath.Join(home(), ".local", "share")
}
func configHome() string {
if v := os.Getenv("XDG_CONFIG_HOME"); v != "" {
return v
}
return filepath.Join(home(), ".config")
}
// BinDir adalah lokasi binary target setelah di-install.
func BinDir() string { return filepath.Join(home(), ".local", "bin") }
// ApplicationsDir menampung file .desktop untuk menu aplikasi.
func ApplicationsDir() string { return filepath.Join(dataHome(), "applications") }
// IconsDir adalah direktori ikon aplikasi XDG.
func IconsDir() string {
return filepath.Join(dataHome(), "icons", "hicolor", "512x512", "apps")
}
// DesktopDir mengikuti xdg-user-dir, fallback ke ~/Desktop.
func DesktopDir() string {
if out, err := exec.Command("xdg-user-dir", "DESKTOP").Output(); err == nil {
if p := strings.TrimSpace(string(out)); p != "" {
return p
}
}
return filepath.Join(home(), "Desktop")
}
// MetadataPath adalah file daftar shortcut milik LazyRun.
func MetadataPath() string {
return filepath.Join(configHome(), "lazyrun", "shortcuts.json")
}
+39
View File
@@ -0,0 +1,39 @@
package xdg
import (
"path/filepath"
"testing"
)
func TestDataHomeOverride(t *testing.T) {
t.Setenv("HOME", "/home/tester")
t.Setenv("XDG_DATA_HOME", "/data")
if got := ApplicationsDir(); got != "/data/applications" {
t.Errorf("ApplicationsDir() = %s", got)
}
if got := IconsDir(); got != filepath.Join("/data", "icons/hicolor/512x512/apps") {
t.Errorf("IconsDir() = %s", got)
}
}
func TestFallbacks(t *testing.T) {
t.Setenv("HOME", "/home/tester")
t.Setenv("XDG_DATA_HOME", "")
t.Setenv("XDG_CONFIG_HOME", "")
if got := ApplicationsDir(); got != "/home/tester/.local/share/applications" {
t.Errorf("ApplicationsDir() = %s", got)
}
if got := BinDir(); got != "/home/tester/.local/bin" {
t.Errorf("BinDir() = %s", got)
}
if got := MetadataPath(); got != "/home/tester/.config/lazyrun/shortcuts.json" {
t.Errorf("MetadataPath() = %s", got)
}
// xdg-user-dir tidak ada di $PATH → fallback ke ~/Desktop.
t.Setenv("PATH", "")
if got := DesktopDir(); got != "/home/tester/Desktop" {
t.Errorf("DesktopDir() = %s", got)
}
}