From: Louis Lenders xerox.xerox2000x@gmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49987
GTK apps seem to use this env var to find path to schemas, like Meld: https://download.gnome.org/binaries/win32/meld/3.22/Meld-3.22.2-mingw.msi which doesn't start at all without this patch. More info in https://bugs.winehq.org/show_bug.cgi?id=49987.
v2: add WINEXDG_DATA_DIRS and use that in winemenubuilder. --- dlls/ntdll/unix/env.c | 6 ++++-- dlls/ntdll/unix/loader.c | 9 +++++++++ dlls/ntdll/unix/unix_private.h | 1 + programs/winemenubuilder/winemenubuilder.c | 5 +---- 4 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 7193cceb87e..9c7742e572b 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -346,6 +346,7 @@ static BOOL is_special_env_var( const char *var ) STARTS_WITH( var, "TMP=" ) || STARTS_WITH( var, "QT_" ) || STARTS_WITH( var, "VK_" ) || + STARTS_WITH( var, "XDG_DATA_DIRS=" ) || STARTS_WITH( var, "XDG_SESSION_TYPE=" )); }
@@ -364,7 +365,8 @@ static BOOL is_dynamic_env_var( const char *var ) STARTS_WITH( var, "WINEUSERNAME=" ) || STARTS_WITH( var, "WINEPRELOADRESERVE=" ) || STARTS_WITH( var, "WINELOADERNOEXEC=" ) || - STARTS_WITH( var, "WINESERVERSOCKET=" )); + STARTS_WITH( var, "WINESERVERSOCKET=" ) || + STARTS_WITH( var, "WINEXDG_DATA_DIRS=" )); }
/****************************************************************** @@ -1110,11 +1112,11 @@ static void add_dynamic_environment( WCHAR **env, SIZE_T *pos, SIZE_T *size ) } else append_envW( env, pos, size, "WINEUNIXCP", NULL ); append_envA( env, pos, size, "WINEUSERLOCALE", user_locale ); + append_envA( env, pos, size, "WINEXDG_DATA_DIRS", xdg_data_dirs ); append_envA( env, pos, size, "SystemDrive", "C:" ); append_envA( env, pos, size, "SystemRoot", "C:\windows" ); }
- static WCHAR *expand_value( WCHAR *env, SIZE_T size, const WCHAR *src, SIZE_T src_len ) { SIZE_T len, retlen = src_len + 1, count = 0; diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index ecbcd439ee7..81f6807e229 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -156,6 +156,8 @@ const char *wineloader = NULL; const char **dll_paths = NULL; const char **system_dll_paths = NULL; const char *user_name = NULL; +const char *xdg_data_dirs = NULL; + SECTION_IMAGE_INFORMATION main_image_info = { NULL };
/* die on a fatal error; use only during initialization */ @@ -434,6 +436,12 @@ static void set_config_dir(void) } }
+static void set_xdg_dirs(void) +{ + xdg_data_dirs = getenv( "XDG_DATA_DIRS" ); + if (!xdg_data_dirs) xdg_data_dirs = strdup( "/usr/local/share/:/usr/share/" ); +} + static void init_paths(void) { Dl_info info; @@ -458,6 +466,7 @@ static void init_paths(void) set_system_dll_path(); set_home_dir(); set_config_dir(); + set_xdg_dirs(); }
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 2e80c8bd02b..030198ef57d 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -164,6 +164,7 @@ extern const char *build_dir; extern const char *config_dir; extern const char *wineloader; extern const char *user_name; +extern const char *xdg_data_dirs; extern const char **dll_paths; extern const char **system_dll_paths; extern pthread_key_t teb_key; diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c index f3ed125cccc..6b0f37e7128 100644 --- a/programs/winemenubuilder/winemenubuilder.c +++ b/programs/winemenubuilder/winemenubuilder.c @@ -1721,10 +1721,7 @@ static BOOL build_native_mime_types(struct list *mime_types) WCHAR *dirs, *dir, *dos_name, *ctx, *p; BOOL ret;
- if (_wgetenv( L"XDG_DATA_DIRS" )) - dirs = xwcsdup( _wgetenv( L"XDG_DATA_DIRS" )); - else - dirs = xwcsdup( L"/usr/local/share/:/usr/share/" ); + dirs = xwcsdup( _wgetenv( L"WINEXDG_DATA_DIRS" ));
ret = add_mimes(xdg_data_dir, mime_types); if (ret)