]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/stdpaths.cpp
implement support for button bitmaps (normal state only for now) for wxGTK
[wxWidgets.git] / src / msw / stdpaths.cpp
index e8340f1a26a99de771d53ff906bf25f479a8129e..4f2cfd65c531a9d2961f75a2ee056faaf2954e96 100644 (file)
@@ -79,10 +79,14 @@ typedef HRESULT (WINAPI *SHGetSpecialFolderPath_t)(HWND, LPTSTR, int, BOOL);
 #ifndef SHGFP_TYPE_DEFAULT
     #define SHGFP_TYPE_DEFAULT 1
 #endif
+
 // ----------------------------------------------------------------------------
 // module globals
 // ----------------------------------------------------------------------------
 
+namespace
+{
+
 struct ShellFunctions
 {
     ShellFunctions()
@@ -101,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
 
@@ -161,6 +165,8 @@ static void ResolveShellFunctions()
 #endif
 }
 
+} // anonymous namespace
+
 // ============================================================================
 // wxStandardPaths implementation
 // ============================================================================
@@ -245,24 +251,14 @@ wxString wxStandardPaths::DoGetDirectory(int csidl)
     return dir;
 }
 
-/* static */
-wxString wxStandardPaths::GetAppDir()
+wxString wxStandardPaths::GetAppDir() const
 {
-    wxFileName fn(wxGetFullModuleName());
-
-    // allow running the apps directly from build directory in MSVC debug builds
-#ifdef _DEBUG
-    wxString lastdir;
-    if ( fn.GetDirCount() )
+    if ( m_appDir.empty() )
     {
-        lastdir = fn.GetDirs().Last();
-        lastdir.MakeLower();
-        if ( lastdir.Matches(_T("debug*")) || lastdir.Matches(_T("vc*msw*")) )
-            fn.RemoveLastDir();
+        m_appDir = wxFileName(wxGetFullModuleName()).GetPath();
     }
-#endif // _DEBUG
 
-    return fn.GetPath();
+    return m_appDir;
 }
 
 wxString wxStandardPaths::GetDocumentsDir() const
@@ -270,10 +266,74 @@ wxString wxStandardPaths::GetDocumentsDir() const
     return DoGetDirectory(CSIDL_PERSONAL);
 }
 
+// ----------------------------------------------------------------------------
+// MSW-specific functions
+// ----------------------------------------------------------------------------
+
+void wxStandardPaths::IgnoreAppSubDir(const wxString& subdirPattern)
+{
+    wxFileName fn = wxFileName::DirName(GetAppDir());
+
+    if ( !fn.GetDirCount() )
+    {
+        // 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();
+    }
+}
+
+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
+
+    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();