Module: wine Branch: master Commit: e4c285b0742e8bbeb8c0b744cc7023c985d65dc0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e4c285b0742e8bbeb8c0b744cc...
Author: Francois Gouget fgouget@codeweavers.com Date: Fri Apr 3 01:25:04 2015 +0200
shell32: Point the 'My Documents' symbolic link to the XDG or OS X 'Documents' folder if they exist.
---
dlls/shell32/shellpath.c | 54 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 15 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index e184434..cfd3094 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -2786,7 +2786,7 @@ static void _SHCreateSymbolicLinks(void) { UINT aidsMyStuff[] = { IDS_MYPICTURES, IDS_MYVIDEOS, IDS_MYMUSIC }, i; int acsidlMyStuff[] = { CSIDL_MYPICTURES, CSIDL_MYVIDEO, CSIDL_MYMUSIC }; - static const char * const xdg_dirs[] = { "PICTURES", "VIDEOS", "MUSIC", "DESKTOP" }; + static const char * const xdg_dirs[] = { "PICTURES", "VIDEOS", "MUSIC", "DOCUMENTS", "DESKTOP" }; static const unsigned int num = sizeof(xdg_dirs) / sizeof(xdg_dirs[0]); WCHAR wszTempPath[MAX_PATH]; char szPersonalTarget[FILENAME_MAX], *pszPersonal; @@ -2809,23 +2809,47 @@ static void _SHCreateSymbolicLinks(void) if (FAILED(hr)) xdg_results = NULL;
pszHome = getenv("HOME"); - if (pszHome && !stat(pszHome, &statFolder) && S_ISDIR(statFolder.st_mode)) { - strcpy(szPersonalTarget, pszHome); - if (_SHAppendToUnixPath(szPersonalTarget, MAKEINTRESOURCEW(IDS_PERSONAL)) && - !stat(szPersonalTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) + if (pszHome && !stat(pszHome, &statFolder) && S_ISDIR(statFolder.st_mode)) + { + while (1) { - /* '$HOME/My Documents' exists. Create 'My Pictures', 'My Videos' and - * 'My Music' subfolders or fail silently if they already exist. */ - for (i = 0; i < sizeof(aidsMyStuff)/sizeof(aidsMyStuff[0]); i++) { - strcpy(szMyStuffTarget, szPersonalTarget); - if (_SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i]))) - mkdir(szMyStuffTarget, 0777); + /* Check if there's already a Wine-specific 'My Documents' folder */ + strcpy(szPersonalTarget, pszHome); + if (_SHAppendToUnixPath(szPersonalTarget, MAKEINTRESOURCEW(IDS_PERSONAL)) && + !stat(szPersonalTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) + { + /* '$HOME/My Documents' exists. Create 'My Pictures', + * 'My Videos' and 'My Music' subfolders or fail silently if + * they already exist. + */ + for (i = 0; i < sizeof(aidsMyStuff)/sizeof(*aidsMyStuff); i++) + { + strcpy(szMyStuffTarget, szPersonalTarget); + if (_SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i]))) + mkdir(szMyStuffTarget, 0777); + } + break; } - } - else - { - /* '$HOME/My Documents' doesn't exists, but '$HOME' does. */ + + /* Try to point to the XDG Documents folder */ + if (xdg_results && xdg_results[num-2] && + !stat(xdg_results[num-2], &statFolder) && + S_ISDIR(statFolder.st_mode)) + { + strcpy(szPersonalTarget, xdg_results[num-2]); + break; + } + + /* Or the hardcoded / OS X Documents folder */ strcpy(szPersonalTarget, pszHome); + if (_SHAppendToUnixPath(szPersonalTarget, DocumentsW) && + !stat(szPersonalTarget, &statFolder) && + S_ISDIR(statFolder.st_mode)) + break; + + /* As a last resort point to $HOME. */ + strcpy(szPersonalTarget, pszHome); + break; }
/* Replace 'My Documents' directory with a symlink or fail silently if not empty. */