paths_windows.go raw
1 package xdg
2
3 import (
4 "path/filepath"
5
6 "github.com/adrg/xdg/internal/pathutil"
7 "github.com/adrg/xdg/internal/userdirs"
8 "golang.org/x/sys/windows"
9 )
10
11 func initDirs(home string) {
12 kf := initKnownFolders(home)
13 initBaseDirs(home, kf)
14 initUserDirs(home, kf)
15 }
16
17 func initBaseDirs(home string, kf *knownFolders) {
18 // Initialize standard directories.
19 baseDirs.dataHome = pathutil.EnvPath(envDataHome, kf.localAppData)
20 baseDirs.data = pathutil.EnvPathList(envDataDirs, kf.roamingAppData, kf.programData)
21 baseDirs.configHome = pathutil.EnvPath(envConfigHome, kf.localAppData)
22 baseDirs.config = pathutil.EnvPathList(envConfigDirs, kf.programData, kf.roamingAppData)
23 baseDirs.stateHome = pathutil.EnvPath(envStateHome, kf.localAppData)
24 baseDirs.cacheHome = pathutil.EnvPath(envCacheHome, filepath.Join(kf.localAppData, "cache"))
25 baseDirs.runtime = pathutil.EnvPath(envRuntimeDir, kf.localAppData)
26
27 // Initialize non-standard directories.
28 baseDirs.binHome = pathutil.EnvPath(envBinHome, kf.userProgramFiles)
29
30 baseDirs.applications = []string{
31 kf.programs,
32 kf.commonPrograms,
33 kf.programFiles,
34 kf.programFilesCommon,
35 kf.userProgramFiles,
36 kf.userProgramFilesCommon,
37 }
38
39 baseDirs.fonts = []string{
40 kf.fonts,
41 filepath.Join(kf.localAppData, "Microsoft", "Windows", "Fonts"),
42 }
43 }
44
45 func initUserDirs(home string, kf *knownFolders) {
46 UserDirs.Desktop = pathutil.EnvPath(userdirs.EnvDesktopDir, kf.desktop)
47 UserDirs.Download = pathutil.EnvPath(userdirs.EnvDownloadDir, kf.downloads)
48 UserDirs.Documents = pathutil.EnvPath(userdirs.EnvDocumentsDir, kf.documents)
49 UserDirs.Music = pathutil.EnvPath(userdirs.EnvMusicDir, kf.music)
50 UserDirs.Pictures = pathutil.EnvPath(userdirs.EnvPicturesDir, kf.pictures)
51 UserDirs.Videos = pathutil.EnvPath(userdirs.EnvVideosDir, kf.videos)
52 UserDirs.Templates = pathutil.EnvPath(userdirs.EnvTemplatesDir, kf.templates)
53 UserDirs.PublicShare = pathutil.EnvPath(userdirs.EnvPublicShareDir, kf.public)
54 }
55
56 type knownFolders struct {
57 systemDrive string
58 systemRoot string
59 programData string
60 userProfile string
61 userProfiles string
62 roamingAppData string
63 localAppData string
64 desktop string
65 downloads string
66 documents string
67 music string
68 pictures string
69 videos string
70 templates string
71 public string
72 fonts string
73 programs string
74 commonPrograms string
75 programFiles string
76 programFilesCommon string
77 userProgramFiles string
78 userProgramFilesCommon string
79 }
80
81 func initKnownFolders(home string) *knownFolders {
82 kf := &knownFolders{
83 userProfile: home,
84 }
85 kf.systemDrive = filepath.VolumeName(pathutil.KnownFolder(
86 windows.FOLDERID_Windows,
87 []string{"SystemDrive", "SystemRoot", "windir"},
88 []string{home, `C:`},
89 )) + string(filepath.Separator)
90 kf.systemRoot = pathutil.KnownFolder(
91 windows.FOLDERID_Windows,
92 []string{"SystemRoot", "windir"},
93 []string{filepath.Join(kf.systemDrive, "Windows")},
94 )
95 kf.programData = pathutil.KnownFolder(
96 windows.FOLDERID_ProgramData,
97 []string{"ProgramData", "ALLUSERSPROFILE"},
98 []string{filepath.Join(kf.systemDrive, "ProgramData")},
99 )
100 kf.userProfiles = pathutil.KnownFolder(
101 windows.FOLDERID_UserProfiles,
102 nil,
103 []string{filepath.Join(kf.systemDrive, "Users")},
104 )
105 kf.roamingAppData = pathutil.KnownFolder(
106 windows.FOLDERID_RoamingAppData,
107 []string{"APPDATA"},
108 []string{filepath.Join(home, "AppData", "Roaming")},
109 )
110 kf.localAppData = pathutil.KnownFolder(
111 windows.FOLDERID_LocalAppData,
112 []string{"LOCALAPPDATA"},
113 []string{filepath.Join(home, "AppData", "Local")},
114 )
115 kf.desktop = pathutil.KnownFolder(
116 windows.FOLDERID_Desktop,
117 nil,
118 []string{filepath.Join(home, "Desktop")},
119 )
120 kf.downloads = pathutil.KnownFolder(
121 windows.FOLDERID_Downloads,
122 nil,
123 []string{filepath.Join(home, "Downloads")},
124 )
125 kf.documents = pathutil.KnownFolder(
126 windows.FOLDERID_Documents,
127 nil,
128 []string{filepath.Join(home, "Documents")},
129 )
130 kf.music = pathutil.KnownFolder(
131 windows.FOLDERID_Music,
132 nil,
133 []string{filepath.Join(home, "Music")},
134 )
135 kf.pictures = pathutil.KnownFolder(
136 windows.FOLDERID_Pictures,
137 nil,
138 []string{filepath.Join(home, "Pictures")},
139 )
140 kf.videos = pathutil.KnownFolder(
141 windows.FOLDERID_Videos,
142 nil,
143 []string{filepath.Join(home, "Videos")},
144 )
145 kf.templates = pathutil.KnownFolder(
146 windows.FOLDERID_Templates,
147 nil,
148 []string{filepath.Join(kf.roamingAppData, "Microsoft", "Windows", "Templates")},
149 )
150 kf.public = pathutil.KnownFolder(
151 windows.FOLDERID_Public,
152 []string{"PUBLIC"},
153 []string{filepath.Join(kf.userProfiles, "Public")},
154 )
155 kf.fonts = pathutil.KnownFolder(
156 windows.FOLDERID_Fonts,
157 nil,
158 []string{filepath.Join(kf.systemRoot, "Fonts")},
159 )
160 kf.programs = pathutil.KnownFolder(
161 windows.FOLDERID_Programs,
162 nil,
163 []string{filepath.Join(kf.roamingAppData, "Microsoft", "Windows", "Start Menu", "Programs")},
164 )
165 kf.commonPrograms = pathutil.KnownFolder(
166 windows.FOLDERID_CommonPrograms,
167 nil,
168 []string{filepath.Join(kf.programData, "Microsoft", "Windows", "Start Menu", "Programs")},
169 )
170 kf.programFiles = pathutil.KnownFolder(
171 windows.FOLDERID_ProgramFiles,
172 []string{"ProgramFiles"},
173 []string{filepath.Join(kf.systemDrive, "Program Files")},
174 )
175 kf.programFilesCommon = pathutil.KnownFolder(
176 windows.FOLDERID_ProgramFilesCommon,
177 nil,
178 []string{filepath.Join(kf.programFiles, "Common Files")},
179 )
180 kf.userProgramFiles = pathutil.KnownFolder(
181 windows.FOLDERID_UserProgramFiles,
182 nil,
183 []string{
184 filepath.Join(kf.localAppData, "Programs"),
185 },
186 )
187 kf.userProgramFilesCommon = pathutil.KnownFolder(
188 windows.FOLDERID_UserProgramFilesCommon,
189 nil,
190 []string{
191 filepath.Join(kf.userProgramFiles, "Common"),
192 },
193 )
194
195 return kf
196 }
197