Alexandre Julliard : shell32: Check for macOS at runtime.
Alexandre Julliard
julliard at winehq.org
Fri Sep 17 16:03:08 CDT 2021
Module: wine
Branch: master
Commit: ac241bf763efb18a3503678c25107dcb76bec94c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ac241bf763efb18a3503678c25107dcb76bec94c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Sep 17 17:47:07 2021 +0200
shell32: Check for macOS at runtime.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/shell32/recyclebin.c | 79 ++++++++++++++++++++++++++---------------------
1 file changed, 44 insertions(+), 35 deletions(-)
diff --git a/dlls/shell32/recyclebin.c b/dlls/shell32/recyclebin.c
index 7db504c18cd..21d3fcd4be7 100644
--- a/dlls/shell32/recyclebin.c
+++ b/dlls/shell32/recyclebin.c
@@ -79,47 +79,56 @@ static WCHAR *trash_dir;
static WCHAR *trash_info_dir;
static ULONG random_seed;
+extern void CDECL wine_get_host_version( const char **sysname, const char **release );
+
+static BOOL is_macos(void)
+{
+ const char *sysname;
+
+ wine_get_host_version( &sysname, NULL );
+ return !strcmp( sysname, "Darwin" );
+}
+
static BOOL WINAPI init_trash_dirs( INIT_ONCE *once, void *param, void **context )
{
- static const WCHAR homedirW[] = {'W','I','N','E','H','O','M','E','D','I','R',0};
- WCHAR var[MAX_PATH], *info = NULL, *files = NULL;
-
-#ifdef __APPLE__
- static const WCHAR trashW[] = {'\\','.','T','r','a','s','h',0};
-
- if (!GetEnvironmentVariableW( homedirW, var, MAX_PATH )) return TRUE;
- files = heap_alloc( (lstrlenW(var) + lstrlenW(trashW) + 1) * sizeof(WCHAR) );
- lstrcpyW( files, var );
- lstrcatW( files, trashW );
- files[1] = '\\'; /* change \??\ to \\?\ */
-#else
- static const WCHAR dataW[] = {'X','D','G','_','D','A','T','A','_','H','O','M','E',0};
- static const WCHAR infoW[] = {'\\','i','n','f','o',0};
- static const WCHAR filesW[] = {'\\','f','i','l','e','s',0};
- static const WCHAR home_fmtW[] = {'%','s','/','.','l','o','c','a','l','/','s','h','a','r','e','/','T','r','a','s','h',0};
- static const WCHAR config_fmtW[] = {'\\','?','?','\\','u','n','i','x','%','s','/','T','r','a','s','h',0};
- const WCHAR *fmt = config_fmtW;
- WCHAR *p;
+ const WCHAR *home = _wgetenv( L"WINEHOMEDIR" );
+ WCHAR *info = NULL, *files = NULL;
ULONG len;
- if (!GetEnvironmentVariableW( dataW, var + 8, MAX_PATH - 8 ) || !var[8])
+ if (!home) return TRUE;
+ if (is_macos())
{
- if (!GetEnvironmentVariableW( homedirW, var, MAX_PATH )) return TRUE;
- fmt = home_fmtW;
+ static const WCHAR trashW[] = {'\\','.','T','r','a','s','h',0};
+
+ files = heap_alloc( (lstrlenW(home) + lstrlenW(trashW) + 1) * sizeof(WCHAR) );
+ lstrcpyW( files, home );
+ lstrcatW( files, trashW );
+ files[1] = '\\'; /* change \??\ to \\?\ */
+ }
+ else
+ {
+ const WCHAR *data_home = _wgetenv( L"XDG_DATA_HOME" );
+ const WCHAR *fmt = L"%s/.local/share/Trash";
+ WCHAR *p;
+
+ if (data_home && data_home[0] == '/')
+ {
+ home = data_home;
+ fmt = L"\\??\\unix%s/Trash";
+ }
+ len = lstrlenW(home) + lstrlenW(fmt) + 7;
+ files = heap_alloc( len * sizeof(WCHAR) );
+ swprintf( files, len, fmt, home );
+ files[1] = '\\'; /* change \??\ to \\?\ */
+ for (p = files; *p; p++) if (*p == '/') *p = '\\';
+ CreateDirectoryW( files, NULL );
+ info = heap_alloc( len * sizeof(WCHAR) );
+ lstrcpyW( info, files );
+ lstrcatW( files, L"\\files" );
+ lstrcatW( info, L"\\info" );
+ if (!CreateDirectoryW( info, NULL ) && GetLastError() != ERROR_ALREADY_EXISTS) goto done;
+ trash_info_dir = info;
}
- len = lstrlenW(var) + lstrlenW(fmt) + lstrlenW(filesW) + 1;
- files = heap_alloc( len * sizeof(WCHAR) );
- swprintf( files, len, fmt, var );
- files[1] = '\\'; /* change \??\ to \\?\ */
- for (p = files; *p; p++) if (*p == '/') *p = '\\';
- CreateDirectoryW( files, NULL );
- info = heap_alloc( len * sizeof(WCHAR) );
- lstrcpyW( info, files );
- lstrcatW( files, filesW );
- lstrcatW( info, infoW );
- if (!CreateDirectoryW( info, NULL ) && GetLastError() != ERROR_ALREADY_EXISTS) goto done;
- trash_info_dir = info;
-#endif
if (!CreateDirectoryW( files, NULL ) && GetLastError() != ERROR_ALREADY_EXISTS) goto done;
trash_dir = files;
More information about the wine-cvs
mailing list