Refactoring complete: v0.4.0 architectural milestone (#1)
## Summary Completed Phase 5 refactoring and reached the target architecture. **Architectural milestone achieved:** - Service layer owns all state and is the sole writer - UI is a thin Fyne view, all widget updates marshaled via `fyne.Do` - Core engines are stateless and injectable - Domain types are pure (no `yaml:"-"` fields) - Full module builds and `go vet ./...` clean ## Changes - Bump version: 0.3.6 → 0.4.0 - Update CHANGELOG with Phase 5 summary - Add ROADMAP "Refactoring Follow-Ups" section ## Known follow-up work 1. **Linux test build broken** — `runner_test.go` needs `//go:build windows` tag 2. **File-size limits exceeded** — `operations.go` (486 lines), `jobs_view.go` (415 lines) See ROADMAP.md for details. --------- Co-authored-by: mixeme <mix.public@ya.ru> Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
//go:build linux
|
||||
|
||||
package desktop
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func InstallDesktopIntegration(appID string, executablePath string, icon []byte) (string, error) {
|
||||
dataHome, err := xdgDataHome()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// The taskbar can only show the application icon reliably when the desktop
|
||||
// environment can match the window app id to an installed .desktop file and
|
||||
// icon. Use the user's XDG data directory so portable builds do not need root
|
||||
// access or a package manager install step.
|
||||
iconPath := filepath.Join(dataHome, "icons", "hicolor", "256x256", "apps", "gosentry.png")
|
||||
if err := writeUserFile(iconPath, icon, 0o644); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
desktopPath := filepath.Join(dataHome, "applications", appID+".desktop")
|
||||
desktopFile := fmt.Sprintf(`[Desktop Entry]
|
||||
Type=Application
|
||||
Name=GoSentry
|
||||
Comment=GoSentry desktop scheduler
|
||||
Exec=%s
|
||||
Icon=%s
|
||||
Terminal=false
|
||||
Categories=Utility;
|
||||
StartupWMClass=%s
|
||||
`, quoteDesktopExec(executablePath), iconPath, appID)
|
||||
if err := writeUserFile(desktopPath, []byte(desktopFile), 0o644); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return iconPath, nil
|
||||
}
|
||||
|
||||
func quoteDesktopExec(path string) string {
|
||||
return strconv.Quote(path)
|
||||
}
|
||||
|
||||
func xdgDataHome() (string, error) {
|
||||
dataHome := os.Getenv("XDG_DATA_HOME")
|
||||
if dataHome == "" {
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
dataHome = filepath.Join(home, ".local", "share")
|
||||
}
|
||||
return dataHome, nil
|
||||
}
|
||||
|
||||
func writeUserFile(path string, data []byte, perm os.FileMode) error {
|
||||
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(path, data, perm)
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
//go:build !linux
|
||||
|
||||
package desktop
|
||||
|
||||
func InstallDesktopIntegration(appID string, executablePath string, icon []byte) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
Reference in New Issue
Block a user