X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e20725256060c40d2f3d8f3cc943290903d171e8..669c595dafb825d27fda99fcde39ad2fc88e0db3:/src/msw/stdpaths.cpp diff --git a/src/msw/stdpaths.cpp b/src/msw/stdpaths.cpp index 27fa594c7e..7eef3af3a0 100644 --- a/src/msw/stdpaths.cpp +++ b/src/msw/stdpaths.cpp @@ -24,6 +24,8 @@ #pragma hdrstop #endif +#if wxUSE_STDPATHS + #ifndef WX_PRECOMP #include "wx/app.h" #endif //WX_PRECOMP @@ -50,6 +52,10 @@ typedef HRESULT (WINAPI *SHGetSpecialFolderPath_t)(HWND, LPTSTR, int, BOOL); // used in our wxLogTrace messages static const wxChar *TRACE_MASK = _T("stdpaths"); +#ifndef CSIDL_APPDATA + #define CSIDL_APPDATA 0x001a +#endif + #ifndef CSIDL_LOCAL_APPDATA #define CSIDL_LOCAL_APPDATA 0x001c #endif @@ -62,6 +68,10 @@ static const wxChar *TRACE_MASK = _T("stdpaths"); #define CSIDL_PROGRAM_FILES 0x0026 #endif +#ifndef CSIDL_PERSONAL + #define CSIDL_PERSONAL 0x0005 +#endif + #ifndef SHGFP_TYPE_CURRENT #define SHGFP_TYPE_CURRENT 0 #endif @@ -69,7 +79,6 @@ static const wxChar *TRACE_MASK = _T("stdpaths"); #ifndef SHGFP_TYPE_DEFAULT #define SHGFP_TYPE_DEFAULT 1 #endif - // ---------------------------------------------------------------------------- // module globals // ---------------------------------------------------------------------------- @@ -100,35 +109,46 @@ static ShellFunctions gs_shellFuncs; static void ResolveShellFunctions() { - // don't give errors if the functions are unavailable, we're ready to deal - // with this - wxLogNull noLog; +#if wxUSE_DYNLIB_CLASS // start with the newest functions, fall back to the oldest ones - +#ifdef __WXWINCE__ + wxString shellDllName(_T("coredll")); +#else // first check for SHGetFolderPath (shell32.dll 5.0) - wxDynamicLibrary dllShell32(_T("shell32")); - if ( !dllShell32.IsLoaded() ) + wxString shellDllName(_T("shell32")); +#endif + + wxDynamicLibrary dllShellFunctions( shellDllName ); + if ( !dllShellFunctions.IsLoaded() ) { - wxLogTrace(TRACE_MASK, _T("Failed to load shell32.dll")); + wxLogTrace(TRACE_MASK, _T("Failed to load %s.dll"), shellDllName.c_str() ); } + // don't give errors if the functions are unavailable, we're ready to deal + // with this + wxLogNull noLog; + #if wxUSE_UNICODE - static const wchar_t UNICODE_SUFFIX = L'W'; + #ifdef __WXWINCE__ + static const wchar_t UNICODE_SUFFIX = L''; // WinCE SH functions don't seem to have 'W' + #else + static const wchar_t UNICODE_SUFFIX = L'W'; + #endif #else // !Unicode static const char UNICODE_SUFFIX = 'A'; #endif // Unicode/!Unicode wxString funcname(_T("SHGetFolderPath")); gs_shellFuncs.pSHGetFolderPath = - (SHGetFolderPath_t)dllShell32.GetSymbol(funcname + UNICODE_SUFFIX); + (SHGetFolderPath_t)dllShellFunctions.GetSymbol(funcname + UNICODE_SUFFIX); // then for SHGetSpecialFolderPath (shell32.dll 4.71) if ( !gs_shellFuncs.pSHGetFolderPath ) { funcname = _T("SHGetSpecialFolderPath"); gs_shellFuncs.pSHGetSpecialFolderPath = (SHGetSpecialFolderPath_t) - dllShell32.GetSymbol(funcname + UNICODE_SUFFIX); + dllShellFunctions.GetSymbol(funcname + UNICODE_SUFFIX); } // finally we fall back on SHGetSpecialFolderLocation (shell32.dll 4.0), @@ -138,6 +158,7 @@ static void ResolveShellFunctions() // because we also link to it statically, so it's ok gs_shellFuncs.initialized = true; +#endif } // ============================================================================ @@ -224,6 +245,31 @@ wxString wxStandardPaths::DoGetDirectory(int csidl) return dir; } +/* static */ +wxString wxStandardPaths::GetAppDir() +{ + wxFileName fn(wxGetFullModuleName()); + + // allow running the apps directly from build directory in debug builds +#ifdef __WXDEBUG__ + wxString lastdir; + if ( fn.GetDirCount() ) + { + lastdir = fn.GetDirs().Last(); + lastdir.MakeLower(); + if ( lastdir.Matches(_T("debug*")) || lastdir.Matches(_T("vc_msw*")) ) + fn.RemoveLastDir(); + } +#endif // __WXDEBUG__ + + return fn.GetPath(); +} + +wxString wxStandardPaths::GetDocumentsDir() const +{ + return DoGetDirectory(CSIDL_PERSONAL); +} + // ---------------------------------------------------------------------------- // public functions // ---------------------------------------------------------------------------- @@ -240,7 +286,9 @@ wxString wxStandardPaths::GetUserConfigDir() const wxString wxStandardPaths::GetDataDir() const { - return AppendAppName(DoGetDirectory(CSIDL_PROGRAM_FILES)); + // under Windows each program is usually installed in its own directory and + // so its datafiles are in the same directory as its main executable + return GetAppDir(); } wxString wxStandardPaths::GetUserDataDir() const @@ -255,10 +303,11 @@ wxString wxStandardPaths::GetUserLocalDataDir() const wxString wxStandardPaths::GetPluginsDir() const { - return wxFileName(wxGetFullModuleName()).GetPath(); + // there is no standard location for plugins, suppose they're in the same + // directory as the .exe + return GetAppDir(); } - // ============================================================================ // wxStandardPathsWin16 implementation // ============================================================================ @@ -274,9 +323,8 @@ wxString wxStandardPathsWin16::GetConfigDir() const wxLogLastError(_T("GetWindowsDirectory")); } #else - // TODO: - // eVC4 - use CSIDL_WINDOWS - // eVC3 - probably not possible through API + // TODO: use CSIDL_WINDOWS (eVC4, possibly not eVC3) + dir = wxT("\\Windows"); #endif return dir; @@ -288,3 +336,4 @@ wxString wxStandardPathsWin16::GetUserConfigDir() const return wxGetHomeDir(); } +#endif // wxUSE_STDPATHS