Windows Vista (and newer releases), default to a flat USER PROFILE model of the form:
Personal='%USERPROFILE%\Documents' My Music='%USERPROFILE%\Music' My Pictures='%USERPROFILE%\Pictures' My Videos='%USERPROFILE%\Videos'
Update _SHCreateSymbolicLinks() description (comment). Update SHELL_RegisterShellFolders() comment.
Signed-off-by: Rob Walker bob.mt.wya@gmail.com --- dlls/shell32/shell32.rc | 8 +++--- dlls/shell32/shellpath.c | 58 +++++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 31 deletions(-)
diff --git a/dlls/shell32/shell32.rc b/dlls/shell32/shell32.rc index 084b052978..b2f91df5ed 100644 --- a/dlls/shell32/shell32.rc +++ b/dlls/shell32/shell32.rc @@ -200,12 +200,12 @@ the folder?" /* shell folder path default values */ /* FIXME: Some will be unused until desktop.ini support is implemented */ IDS_PROGRAMS "Programs" - IDS_PERSONAL "My Documents" + IDS_PERSONAL "Documents" IDS_FAVORITES "Favorites" IDS_STARTUP "StartUp" IDS_STARTMENU "Start Menu" - IDS_MYMUSIC "My Music" - IDS_MYVIDEOS "My Videos" + IDS_MYMUSIC "Music" + IDS_MYVIDEOS "Videos" IDS_DESKTOPDIRECTORY "#msgctxt#directory#Desktop" IDS_NETHOOD "NetHood" IDS_TEMPLATES "Templates" @@ -213,7 +213,7 @@ the folder?" IDS_HISTORY "History" IDS_PROGRAM_FILES "Program Files" IDS_PROGRAM_FILESX86 "Program Files (x86)" - IDS_MYPICTURES "My Pictures" + IDS_MYPICTURES "Pictures" IDS_COMMON_FILES "Common Files" IDS_COMMON_DOCUMENTS "Documents" IDS_ADMINTOOLS "Administrative Tools" diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index d7ddfaf26d..5bf027f6f2 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -4353,13 +4353,13 @@ static inline BOOL _SHAppendToUnixPath(char *szBasePath, LPCWSTR pwszSubPath) { lstrcpyW(wszSubPath, DocumentsW); break; case IDS_MYMUSIC: - lstrcpyW(wszSubPath, My_MusicW); + lstrcpyW(wszSubPath, MusicW); break; case IDS_MYPICTURES: - lstrcpyW(wszSubPath, My_PicturesW); + lstrcpyW(wszSubPath, PicturesW); break; case IDS_MYVIDEOS: - lstrcpyW(wszSubPath, My_VideosW); + lstrcpyW(wszSubPath, VideosW); break; default: ERR("LoadString(%d) failed!\n", LOWORD(pwszSubPath)); @@ -4386,26 +4386,21 @@ static inline BOOL _SHAppendToUnixPath(char *szBasePath, LPCWSTR pwszSubPath) {
/****************************************************************************** * _SHCreateSymbolicLinks [Internal] - * - * Sets up symbol links for various shell folders to point into the users home - * directory. We do an educated guess about what the user would probably want: - * - If there is a 'My Documents' directory in $HOME, the user probably wants - * wine's 'My Documents' to point there. Furthermore, we imply that the user - * is a Windows lover and has no problem with wine creating 'My Pictures', - * 'My Music' and 'My Videos' subfolders under '$HOME/My Documents', if those - * do not already exits. We put appropriate symbolic links in place for those, - * too. - * - If there is no 'My Documents' directory in $HOME, we let 'My Documents' - * point directly to $HOME. We assume the user to be a unix hacker who does not - * want wine to create anything anywhere besides the .wine directory. So, if - * there already is a 'My Music' directory in $HOME, we symlink the 'My Music' - * shell folder to it. But if not, then we check XDG_MUSIC_DIR - "well known" - * directory, and try to link to that. If that fails, then we symlink to - * $HOME directly. The same holds fo 'My Pictures' and 'My Videos'. - * - The Desktop shell folder is symlinked to XDG_DESKTOP_DIR. If that does not - * exist, then we try '$HOME/Desktop'. If that does not exist, then we leave - * it alone. - * ('My Music',... above in fact means LoadString(IDS_MYMUSIC)) + * + * Creates a set of symbolic links from the current Wineprefix to the current + * user $HOME subdirectory (if this is set in the shell env). + * + * For each User Profile directory XXX in + * 'Documents', 'Music', 'Pictures', 'Movies', 'Desktop': + * + * 1) Create the '%USERPROFILE%\XXX' User Profile directory + * (in the current Wineprefix). + * 2) Create a symbolic link from the '%USERPROFILE%\XXX' User Profile directory + * to: + * Resource ID 'XXX' - if '$HOME/XXX' exists then target this. + * XDG_XXX_DIR - if '$XDG_XXX_DIR' exists then target this. + * MacOS 'XXX' directory - if '$HOME/XXX' exists then target this. + * */ static void _SHCreateSymbolicLinks(void) { @@ -6041,10 +6036,19 @@ HRESULT SHELL_RegisterShellFolders(void) { HRESULT hr;
- /* Set up '$HOME' targeted symlinks for 'My Documents', 'My Pictures', - * 'My Videos', 'My Music' and 'Desktop' in advance, so that the - * _SHRegister*ShellFolders() functions will find everything nice and clean - * and thus will not attempt to create them in the profile directory. */ + /* Pre-create and setup '$HOME' subdirectory targeted symlinks for: + * + * '%USERPROFILE\Documents' + * '%USERPROFILE\Music' + * '%USERPROFILE\Pictures', + * '%USERPROFILE\Videos' + * '%USERPROFILE\Desktop' + * + * User Profile directories. + * + * These User Profile directories must pre-exist when calling the: + * _SHRegister*ShellFolders() functions. + */ _SHCreateSymbolicLinks();
hr = _SHRegisterUserShellFolders(TRUE);