X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f77c0fe312a1dedde4a86c9b967d095802c10384..ba8c878f957da36c14879b747a2d54d7fe01baa8:/src/msw/utils.cpp diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index 3e33d7fa69..4e674fcbde 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -55,7 +55,7 @@ #include #endif -#if !defined(__GNUWIN32__) && !defined(__SALFORDC__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) +#if !defined(__GNUWIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) #include #ifndef __MWERKS__ @@ -467,14 +467,14 @@ const wxChar* wxGetHomeDir(wxString *pstr) return strDir.c_str(); } -wxChar *wxGetUserHome(const wxString& WXUNUSED(user)) +wxString wxGetUserHome(const wxString& user) { - // VZ: the old code here never worked for user != "" anyhow! Moreover, it - // returned sometimes a malloc()'d pointer, sometimes a pointer to a - // static buffer and sometimes I don't even know what. - static wxString s_home; + wxString home; - return (wxChar *)wxGetHomeDir(&s_home); + if ( user.empty() || user == wxGetUserId() ) + wxGetHomeDir(&home); + + return home; } bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), @@ -1199,32 +1199,64 @@ bool wxIsPlatform64Bit() wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin) { - OSVERSIONINFO info; - wxZeroMemory(info); + static struct + { + // this may be false, true or -1 if we tried to initialize but failed + int initialized; - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if ( ::GetVersionEx(&info) ) + wxOperatingSystemId os; + + int verMaj, + verMin; + } s_version; + + // query the OS info only once as it's not supposed to change + if ( !s_version.initialized ) { - if (verMaj) *verMaj = info.dwMajorVersion; - if (verMin) *verMin = info.dwMinorVersion; + OSVERSIONINFO info; + wxZeroMemory(info); + info.dwOSVersionInfoSize = sizeof(info); + if ( ::GetVersionEx(&info) ) + { + s_version.initialized = true; + +#if defined(__WXWINCE__) + s_version.os = wxOS_WINDOWS_CE; +#elif defined(__WXMICROWIN__) + s_version.os = wxOS_WINDOWS_MICRO; +#else // "normal" desktop Windows system, use run-time detection + switch ( info.dwPlatformId ) + { + case VER_PLATFORM_WIN32_NT: + s_version.os = wxOS_WINDOWS_NT; + break; + + case VER_PLATFORM_WIN32_WINDOWS: + s_version.os = wxOS_WINDOWS_9X; + break; + } +#endif // Windows versions + + s_version.verMaj = info.dwMajorVersion; + s_version.verMin = info.dwMinorVersion; + } + else // GetVersionEx() failed + { + s_version.initialized = -1; + } } -#if defined( __WXWINCE__ ) - return wxOS_WINDOWS_CE; -#elif defined( __WXMICROWIN__ ) - return wxOS_WINDOWS_MICRO; -#else - switch ( info.dwPlatformId ) + if ( s_version.initialized == 1 ) { - case VER_PLATFORM_WIN32_NT: - return wxOS_WINDOWS_NT; - - case VER_PLATFORM_WIN32_WINDOWS: - return wxOS_WINDOWS_9X; + if ( verMaj ) + *verMaj = s_version.verMaj; + if ( verMin ) + *verMin = s_version.verMin; } - return wxOS_UNKNOWN; -#endif + // this works even if we were not initialized successfully as the initial + // values of this field is 0 which is wxOS_UNKNOWN and exactly what we need + return s_version.os; } wxWinVersion wxGetWinVersion() @@ -1407,8 +1439,10 @@ extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding) case wxFONTENCODING_ISO8859_13: ret = 28603; break; // case wxFONTENCODING_ISO8859_14: ret = 28604; break; // no correspondence on Windows case wxFONTENCODING_ISO8859_15: ret = 28605; break; + case wxFONTENCODING_KOI8: ret = 20866; break; case wxFONTENCODING_KOI8_U: ret = 21866; break; + case wxFONTENCODING_CP437: ret = 437; break; case wxFONTENCODING_CP850: ret = 850; break; case wxFONTENCODING_CP852: ret = 852; break; @@ -1427,7 +1461,9 @@ extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding) case wxFONTENCODING_CP1255: ret = 1255; break; case wxFONTENCODING_CP1256: ret = 1256; break; case wxFONTENCODING_CP1257: ret = 1257; break; + case wxFONTENCODING_EUC_JP: ret = 20932; break; + case wxFONTENCODING_MACROMAN: ret = 10000; break; case wxFONTENCODING_MACJAPANESE: ret = 10001; break; case wxFONTENCODING_MACCHINESETRAD: ret = 10002; break; @@ -1442,8 +1478,12 @@ extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding) case wxFONTENCODING_MACCROATIAN: ret = 10082; break; case wxFONTENCODING_MACICELANDIC: ret = 10079; break; case wxFONTENCODING_MACROMANIAN: ret = 10009; break; + + case wxFONTENCODING_ISO2022_JP: ret = 50222; break; + case wxFONTENCODING_UTF7: ret = 65000; break; case wxFONTENCODING_UTF8: ret = 65001; break; + default: return -1; }