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