Module: wine Branch: master Commit: ff6a3433c5cc8991b6716c502ad9c69d495bf07f URL: https://source.winehq.org/git/wine.git/?a=commit;h=ff6a3433c5cc8991b6716c502...
Author: Alexandre Julliard julliard@winehq.org Date: Sun Feb 28 11:30:37 2021 +0100
ntdll: Store the locales in Wine-specific environment variables.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernelbase/locale.c | 43 ++++++++++++++++++++++++++++++++++++------ dlls/ntdll/locale.c | 36 ----------------------------------- dlls/ntdll/unix/env.c | 19 ++++++------------- dlls/ntdll/unix/loader.c | 1 - dlls/ntdll/unix/unix_private.h | 1 - dlls/ntdll/unixlib.h | 5 +---- 6 files changed, 44 insertions(+), 61 deletions(-)
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index ac473ccd63a..b746feca639 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -696,6 +696,27 @@ done: }
+static LCID locale_to_lcid( WCHAR *win_name ) +{ + WCHAR *p; + LCID lcid; + + if (!RtlLocaleNameToLcid( win_name, &lcid, 0 )) return lcid; + + /* try neutral name */ + if ((p = wcsrchr( win_name, '-' ))) + { + *p = 0; + if (!RtlLocaleNameToLcid( win_name, &lcid, 2 )) + { + if (SUBLANGID(lcid) == SUBLANG_NEUTRAL) + lcid = MAKELANGID( PRIMARYLANGID(lcid), SUBLANG_DEFAULT ); + return lcid; + } + } + return 0; +} + /*********************************************************************** * init_locale */ @@ -704,8 +725,8 @@ void init_locale(void) UINT ansi_cp = 0, oem_cp = 0; USHORT *ansi_ptr, *oem_ptr; void *sort_ptr; - LCID lcid = GetUserDefaultLCID(); - WCHAR bufferW[80]; + LCID user_lcid = 0, system_lcid = 0; + WCHAR bufferW[LOCALE_NAME_MAX_LENGTH]; DYNAMIC_TIME_ZONE_INFORMATION timezone; GEOID geoid = GEOID_NOT_AVAILABLE; DWORD count, dispos, i; @@ -714,6 +735,16 @@ void init_locale(void)
if (GetEnvironmentVariableW( L"WINEUNIXCP", bufferW, ARRAY_SIZE(bufferW) )) unix_cp = wcstoul( bufferW, NULL, 10 ); + if (GetEnvironmentVariableW( L"WINELOCALE", bufferW, ARRAY_SIZE(bufferW) )) + system_lcid = locale_to_lcid( bufferW ); + if (GetEnvironmentVariableW( L"WINEUSERLOCALE", bufferW, ARRAY_SIZE(bufferW) )) + user_lcid = locale_to_lcid( bufferW ); + if (!system_lcid) system_lcid = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT ); + if (!user_lcid) user_lcid = system_lcid; + + NtSetDefaultUILanguage( LANGIDFROMLCID(user_lcid) ); + NtSetDefaultLocale( TRUE, user_lcid ); + NtSetDefaultLocale( FALSE, system_lcid );
kernel32_handle = GetModuleHandleW( L"kernel32.dll" );
@@ -775,11 +806,11 @@ void init_locale(void) count = sizeof(bufferW); if (!RegQueryValueExW( intl_key, L"Locale", NULL, NULL, (BYTE *)bufferW, &count )) { - if (wcstoul( bufferW, NULL, 16 ) == lcid) return; /* already set correctly */ - TRACE( "updating registry, locale changed %s -> %08x\n", debugstr_w(bufferW), lcid ); + if (wcstoul( bufferW, NULL, 16 ) == user_lcid) return; /* already set correctly */ + TRACE( "updating registry, locale changed %s -> %08x\n", debugstr_w(bufferW), user_lcid ); } - else TRACE( "updating registry, locale changed none -> %08x\n", lcid ); - swprintf( bufferW, ARRAY_SIZE(bufferW), L"%08x", lcid ); + else TRACE( "updating registry, locale changed none -> %08x\n", user_lcid ); + swprintf( bufferW, ARRAY_SIZE(bufferW), L"%08x", user_lcid ); RegSetValueExW( intl_key, L"Locale", 0, REG_SZ, (BYTE *)bufferW, (lstrlenW(bufferW) + 1) * sizeof(WCHAR) );
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c index 758789a533c..19626a48b72 100644 --- a/dlls/ntdll/locale.c +++ b/dlls/ntdll/locale.c @@ -533,48 +533,12 @@ static unsigned int compose_string( const struct norm_table *info, WCHAR *str, u }
-static LCID locale_to_lcid( WCHAR *win_name ) -{ - WCHAR *p; - LCID lcid; - - if (!RtlLocaleNameToLcid( win_name, &lcid, 0 )) return lcid; - - /* try neutral name */ - if ((p = wcsrchr( win_name, '-' ))) - { - *p = 0; - if (!RtlLocaleNameToLcid( win_name, &lcid, 2 )) - { - if (SUBLANGID(lcid) == SUBLANG_NEUTRAL) - lcid = MAKELANGID( PRIMARYLANGID(lcid), SUBLANG_DEFAULT ); - return lcid; - } - } - return 0; -} - - /****************************************************************** * init_locale */ void init_locale( HMODULE module ) { - WCHAR system_locale[LOCALE_NAME_MAX_LENGTH]; - WCHAR user_locale[LOCALE_NAME_MAX_LENGTH]; - kernel32_handle = module; - - unix_funcs->get_locales( system_locale, user_locale ); - system_lcid = locale_to_lcid( system_locale ); - user_lcid = locale_to_lcid( user_locale ); - if (!system_lcid) system_lcid = MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT), SORT_DEFAULT ); - if (!user_lcid) user_lcid = system_lcid; - - NtSetDefaultUILanguage( LANGIDFROMLCID(user_lcid) ); - NtSetDefaultLocale( TRUE, user_lcid ); - NtSetDefaultLocale( FALSE, system_lcid ); - TRACE( "system=%04x user=%04x\n", system_lcid, user_lcid ); }
diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 84d5ab298a4..cca334865e4 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -545,6 +545,8 @@ static BOOL is_dynamic_env_var( const char *var ) STARTS_WITH( var, "WINECONFIGDIR=" ) || STARTS_WITH( var, "WINEDLLDIR" ) || STARTS_WITH( var, "WINEUNIXCP=" ) || + STARTS_WITH( var, "WINELOCALE=" ) || + STARTS_WITH( var, "WINEUSERLOCALE=" ) || STARTS_WITH( var, "WINEUSERNAME=" ) || STARTS_WITH( var, "WINEPRELOADRESERVE=" ) || STARTS_WITH( var, "WINELOADERNOEXEC=" ) || @@ -1197,13 +1199,14 @@ static WCHAR *get_dynamic_environment( SIZE_T *size ) DWORD i; char str[22];
- alloc = 20 * 8; /* 8 variable names */ + alloc = 20 * 10; /* 10 variable names */ if (data_dir) alloc += strlen( data_dir ) + 9; if (home_dir) alloc += strlen( home_dir ) + 9; if (build_dir) alloc += strlen( build_dir ) + 9; if (config_dir) alloc += strlen( config_dir ) + 9; if (user_name) alloc += strlen( user_name ); if (overrides) alloc += strlen( overrides ); + alloc += strlen(system_locale) + strlen(user_locale); for (i = 0; dll_paths[i]; i++) alloc += 20 + strlen( dll_paths[i] ) + 9;
if (!(buffer = malloc( alloc * sizeof(WCHAR) ))) return NULL; @@ -1223,6 +1226,8 @@ static WCHAR *get_dynamic_environment( SIZE_T *size ) sprintf( str, "%u", unix_cp.data[1] ); append_envA( buffer, &pos, "WINEUNIXCP", str ); } + append_envA( buffer, &pos, "WINELOCALE", system_locale ); + if (strcmp( user_locale, system_locale )) append_envA( buffer, &pos, "WINEUSERLOCALE", user_locale ); assert( pos <= alloc ); *size = pos * sizeof(WCHAR); return buffer; @@ -1355,18 +1360,6 @@ static void get_initial_directory( UNICODE_STRING *dir ) }
-/************************************************************************* - * get_locales - * - * Return the system and user locales. Buffers must be at least LOCALE_NAME_MAX_LENGTH chars long. - */ -void CDECL get_locales( WCHAR *sys, WCHAR *user ) -{ - ntdll_umbstowcs( system_locale, strlen(system_locale) + 1, sys, LOCALE_NAME_MAX_LENGTH ); - ntdll_umbstowcs( user_locale, strlen(user_locale) + 1, user, LOCALE_NAME_MAX_LENGTH ); -} - - /*********************************************************************** * build_command_line * diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 21e1e1893c0..b7e1432535d 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -1715,7 +1715,6 @@ static struct unix_funcs unix_funcs = ntdll_sin, ntdll_sqrt, ntdll_tan, - get_locales, virtual_release_address_space, load_so_dll, load_builtin_dll, diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index d56fc9b0f19..031f9ed3d33 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -100,7 +100,6 @@ extern LONGLONG CDECL fast_RtlGetSystemTimePrecise(void) DECLSPEC_HIDDEN; extern NTSTATUS CDECL fast_wait_cv( RTL_CONDITION_VARIABLE *variable, const void *value, const LARGE_INTEGER *timeout ) DECLSPEC_HIDDEN;
-extern void CDECL get_locales( WCHAR *sys, WCHAR *user ) DECLSPEC_HIDDEN; extern void CDECL virtual_release_address_space(void) DECLSPEC_HIDDEN;
extern NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispatch, diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index 6a7f008ed9c..290379a9310 100644 --- a/dlls/ntdll/unixlib.h +++ b/dlls/ntdll/unixlib.h @@ -26,7 +26,7 @@ struct _DISPATCHER_CONTEXT;
/* increment this when you change the function table */ -#define NTDLL_UNIXLIB_VERSION 114 +#define NTDLL_UNIXLIB_VERSION 115
struct unix_funcs { @@ -69,9 +69,6 @@ struct unix_funcs double (CDECL *sqrt)( double d ); double (CDECL *tan)( double d );
- /* environment functions */ - void (CDECL *get_locales)( WCHAR *sys, WCHAR *user ); - /* virtual memory functions */ void (CDECL *virtual_release_address_space)(void);