X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/adaa49a801c69360fb57d13e1fe8aef7022c3b34..e77cba1a9c2085b15789bbdc3d38697c4670d2a7:/src/msw/stdpaths.cpp diff --git a/src/msw/stdpaths.cpp b/src/msw/stdpaths.cpp index 5e9de59ee3..4f2cfd65c5 100644 --- a/src/msw/stdpaths.cpp +++ b/src/msw/stdpaths.cpp @@ -26,15 +26,15 @@ #if wxUSE_STDPATHS +#include "wx/stdpaths.h" + #ifndef WX_PRECOMP - #include "wx/app.h" + #include "wx/utils.h" #endif //WX_PRECOMP #include "wx/dynlib.h" #include "wx/filename.h" -#include "wx/stdpaths.h" - #include "wx/msw/private.h" #include "wx/msw/wrapshl.h" @@ -50,7 +50,7 @@ typedef HRESULT (WINAPI *SHGetSpecialFolderPath_t)(HWND, LPTSTR, int, BOOL); // ---------------------------------------------------------------------------- // used in our wxLogTrace messages -static const wxChar *TRACE_MASK = _T("stdpaths"); +#define TRACE_MASK _T("stdpaths") #ifndef CSIDL_APPDATA #define CSIDL_APPDATA 0x001a @@ -68,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 @@ -80,6 +84,9 @@ static const wxChar *TRACE_MASK = _T("stdpaths"); // module globals // ---------------------------------------------------------------------------- +namespace +{ + struct ShellFunctions { ShellFunctions() @@ -98,13 +105,13 @@ struct ShellFunctions // in spite of using a static variable, this is MT-safe as in the worst case it // results in initializing the function pointer several times -- but this is // harmless -static ShellFunctions gs_shellFuncs; +ShellFunctions gs_shellFuncs; // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- -static void ResolveShellFunctions() +void ResolveShellFunctions() { #if wxUSE_DYNLIB_CLASS @@ -158,6 +165,8 @@ static void ResolveShellFunctions() #endif } +} // anonymous namespace + // ============================================================================ // wxStandardPaths implementation // ============================================================================ @@ -242,33 +251,97 @@ wxString wxStandardPaths::DoGetDirectory(int csidl) return dir; } -/* static */ -wxString wxStandardPaths::GetAppDir() +wxString wxStandardPaths::GetAppDir() const { - wxFileName fn(wxGetFullModuleName()); + if ( m_appDir.empty() ) + { + m_appDir = wxFileName(wxGetFullModuleName()).GetPath(); + } + + return m_appDir; +} + +wxString wxStandardPaths::GetDocumentsDir() const +{ + return DoGetDirectory(CSIDL_PERSONAL); +} - // allow running the apps directly from build directory in debug builds -#ifdef __WXDEBUG__ - wxString lastdir; - if ( fn.GetDirCount() ) +// ---------------------------------------------------------------------------- +// MSW-specific functions +// ---------------------------------------------------------------------------- + +void wxStandardPaths::IgnoreAppSubDir(const wxString& subdirPattern) +{ + wxFileName fn = wxFileName::DirName(GetAppDir()); + + if ( !fn.GetDirCount() ) { - lastdir = fn.GetDirs().Last(); - lastdir.MakeLower(); - if ( lastdir.Matches(_T("debug*")) || lastdir.Matches(_T("vc_msw*")) ) - fn.RemoveLastDir(); + // no last directory to ignore anyhow + return; + } + + const wxString lastdir = fn.GetDirs().Last().Lower(); + if ( lastdir.Matches(subdirPattern.Lower()) ) + { + fn.RemoveLastDir(); + + // store the cached value so that subsequent calls to GetAppDir() will + // reuse it instead of using just the program binary directory + m_appDir = fn.GetPath(); } -#endif // __WXDEBUG__ +} + +void wxStandardPaths::IgnoreAppBuildSubDirs() +{ + IgnoreAppSubDir("debug"); + IgnoreAppSubDir("release"); + + wxString compilerPrefix; +#ifdef __VISUALC__ + compilerPrefix = "vc"; +#elif defined(__GNUG__) + compilerPrefix = "gcc"; +#elif defined(__BORLANDC__) + compilerPrefix = "bcc"; +#elif defined(__DIGITALMARS__) + compilerPrefix = "dmc"; +#elif defined(__WATCOMC__) + compilerPrefix = "wat"; +#else + return; +#endif - return fn.GetPath(); + IgnoreAppSubDir(compilerPrefix + "_msw*"); +} + +void wxStandardPaths::DontIgnoreAppSubDir() +{ + // this will force the next call to GetAppDir() to use the program binary + // path as the application directory + m_appDir.clear(); } // ---------------------------------------------------------------------------- // public functions // ---------------------------------------------------------------------------- +wxStandardPaths::wxStandardPaths() +{ + // under MSW it's common to use both the applicatio nand vendor + UseAppInfo(AppInfo_AppName | AppInfo_VendorName); + + // make it possible to run uninstalled application from the build directory + IgnoreAppBuildSubDirs(); +} + +wxString wxStandardPaths::GetExecutablePath() const +{ + return wxGetFullModuleName(); +} + wxString wxStandardPaths::GetConfigDir() const { - return AppendAppName(DoGetDirectory(CSIDL_COMMON_APPDATA)); + return AppendAppInfo(DoGetDirectory(CSIDL_COMMON_APPDATA)); } wxString wxStandardPaths::GetUserConfigDir() const @@ -285,12 +358,12 @@ wxString wxStandardPaths::GetDataDir() const wxString wxStandardPaths::GetUserDataDir() const { - return AppendAppName(GetUserConfigDir()); + return AppendAppInfo(GetUserConfigDir()); } wxString wxStandardPaths::GetUserLocalDataDir() const { - return AppendAppName(DoGetDirectory(CSIDL_LOCAL_APPDATA)); + return AppendAppInfo(DoGetDirectory(CSIDL_LOCAL_APPDATA)); } wxString wxStandardPaths::GetPluginsDir() const