paths_unix.go raw
1 //go:build aix || dragonfly || freebsd || (js && wasm) || nacl || linux || netbsd || openbsd || solaris
2
3 package xdg
4
5 import (
6 "os"
7 "path/filepath"
8 "strconv"
9
10 "github.com/adrg/xdg/internal/pathutil"
11 "github.com/adrg/xdg/internal/userdirs"
12 )
13
14 func initDirs(home string) {
15 initBaseDirs(home)
16 initUserDirs(home, baseDirs.configHome)
17 }
18
19 func initBaseDirs(home string) {
20 // Initialize standard directories.
21 baseDirs.dataHome = pathutil.EnvPath(envDataHome, filepath.Join(home, ".local", "share"))
22 baseDirs.data = pathutil.EnvPathList(envDataDirs, "/usr/local/share", "/usr/share")
23 baseDirs.configHome = pathutil.EnvPath(envConfigHome, filepath.Join(home, ".config"))
24 baseDirs.config = pathutil.EnvPathList(envConfigDirs, "/etc/xdg")
25 baseDirs.stateHome = pathutil.EnvPath(envStateHome, filepath.Join(home, ".local", "state"))
26 baseDirs.cacheHome = pathutil.EnvPath(envCacheHome, filepath.Join(home, ".cache"))
27 baseDirs.runtime = pathutil.EnvPath(envRuntimeDir, filepath.Join("/run/user", strconv.Itoa(os.Getuid())))
28
29 // Initialize non-standard directories.
30 baseDirs.binHome = pathutil.EnvPath(envBinHome, filepath.Join(home, ".local", "bin"))
31
32 appDirs := []string{
33 filepath.Join(baseDirs.dataHome, "applications"),
34 filepath.Join(home, ".local/share/applications"),
35 "/usr/local/share/applications",
36 "/usr/share/applications",
37 }
38
39 fontDirs := []string{
40 filepath.Join(baseDirs.dataHome, "fonts"),
41 filepath.Join(home, ".fonts"),
42 filepath.Join(home, ".local/share/fonts"),
43 "/usr/local/share/fonts",
44 "/usr/share/fonts",
45 }
46
47 for _, dir := range baseDirs.data {
48 appDirs = append(appDirs, filepath.Join(dir, "applications"))
49 fontDirs = append(fontDirs, filepath.Join(dir, "fonts"))
50 }
51
52 baseDirs.applications = pathutil.Unique(appDirs)
53 baseDirs.fonts = pathutil.Unique(fontDirs)
54 }
55
56 func initUserDirs(home, configHome string) {
57 dirs, err := userdirs.ParseConfigFile(filepath.Join(configHome, "user-dirs.dirs"))
58 if err != nil {
59 dirs = &UserDirectories{}
60 }
61
62 UserDirs.Desktop = pathutil.EnvPath(userdirs.EnvDesktopDir, dirs.Desktop, filepath.Join(home, "Desktop"))
63 UserDirs.Download = pathutil.EnvPath(userdirs.EnvDownloadDir, dirs.Download, filepath.Join(home, "Downloads"))
64 UserDirs.Documents = pathutil.EnvPath(userdirs.EnvDocumentsDir, dirs.Documents, filepath.Join(home, "Documents"))
65 UserDirs.Music = pathutil.EnvPath(userdirs.EnvMusicDir, dirs.Music, filepath.Join(home, "Music"))
66 UserDirs.Pictures = pathutil.EnvPath(userdirs.EnvPicturesDir, dirs.Pictures, filepath.Join(home, "Pictures"))
67 UserDirs.Videos = pathutil.EnvPath(userdirs.EnvVideosDir, dirs.Videos, filepath.Join(home, "Videos"))
68 UserDirs.Templates = pathutil.EnvPath(userdirs.EnvTemplatesDir, dirs.Templates, filepath.Join(home, "Templates"))
69 UserDirs.PublicShare = pathutil.EnvPath(userdirs.EnvPublicShareDir, dirs.PublicShare, filepath.Join(home, "Public"))
70 }
71