]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/utils.cpp
implemented menu drawing in the GTK theme
[wxWidgets.git] / src / msw / utils.cpp
index f53f41c260e2b83d9637a2a49a8f99d8c5665df0..8c8e1086504f70830dc2480b2c1a89f580a85ae2 100644 (file)
@@ -382,25 +382,55 @@ const wxChar* wxGetHomeDir(wxString *pstr)
     #endif
   #else   // Windows
     #ifdef  __WIN32__
-      const wxChar *szHome = wxGetenv(wxT("HOMEDRIVE"));
+      strDir.clear();
+
+      // If we have a valid HOME directory, as is used on many machines that
+      // have unix utilities on them, we should use that.
+      const wxChar *szHome = wxGetenv(wxT("HOME"));
+
       if ( szHome != NULL )
-        strDir << szHome;
-      szHome = wxGetenv(wxT("HOMEPATH"));
-      if ( szHome != NULL ) {
-        strDir << szHome;
-
-        // the idea is that under NT these variables have default values
-        // of "%systemdrive%:" and "\\". As we don't want to create our
-        // config files in the root directory of the system drive, we will
-        // create it in our program's dir. However, if the user took care
-        // to set HOMEPATH to something other than "\\", we suppose that he
-        // knows what he is doing and use the supplied value.
-        if ( wxStrcmp(szHome, wxT("\\")) != 0 )
-          return strDir.c_str();
+      {
+        strDir = szHome;
+      }
+      else // no HOME, try HOMEDRIVE/PATH
+      {
+          szHome = wxGetenv(wxT("HOMEDRIVE"));
+          if ( szHome != NULL )
+            strDir << szHome;
+          szHome = wxGetenv(wxT("HOMEPATH"));
+
+          if ( szHome != NULL )
+          {
+            strDir << szHome;
+
+            // the idea is that under NT these variables have default values
+            // of "%systemdrive%:" and "\\". As we don't want to create our
+            // config files in the root directory of the system drive, we will
+            // create it in our program's dir. However, if the user took care
+            // to set HOMEPATH to something other than "\\", we suppose that he
+            // knows what he is doing and use the supplied value.
+            if ( wxStrcmp(szHome, wxT("\\")) == 0 )
+              strDir.clear();
+          }
       }
 
+      if ( strDir.empty() )
+      {
+          // If we have a valid USERPROFILE directory, as is the case in
+          // Windows NT, 2000 and XP, we should use that as our home directory.
+          szHome = wxGetenv(wxT("USERPROFILE"));
+
+          if ( szHome != NULL )
+            strDir = szHome;
+      }
+
+      if ( !strDir.empty() )
+      {
+          return strDir.c_str();
+      }
+      //else: fall back to the prograrm directory
     #else   // Win16
-      // Win16 has no idea about home, so use the working directory instead
+      // Win16 has no idea about home, so use the executable directory instead
     #endif  // WIN16/32
 
     // 260 was taken from windef.h
@@ -498,14 +528,22 @@ bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree)
             return FALSE;
         }
 
+        // ULARGE_INTEGER is a union of a 64 bit value and a struct containing
+        // two 32 bit fields which may be or may be not named - try to make it
+        // compile in all cases
+#if defined(__BORLANDC__) && !defined(_ANONYMOUS_STRUCT)
+        #define UL(ul) ul.u
+#else // anon union
+        #define UL(ul) ul
+#endif
         if ( pTotal )
         {
-            *pTotal = wxLongLong(bytesTotal.HighPart, bytesTotal.LowPart);
+            *pTotal = wxLongLong(UL(bytesTotal).HighPart, UL(bytesTotal).LowPart);
         }
 
         if ( pFree )
         {
-            *pFree = wxLongLong(bytesFree.HighPart, bytesFree.LowPart);
+            *pFree = wxLongLong(UL(bytesFree).HighPart, UL(bytesFree).LowPart);
         }
     }
     else
@@ -906,31 +944,43 @@ wxString wxGetOsDescription()
 int wxGetOsVersion(int *majorVsn, int *minorVsn)
 {
 #if defined(__WIN32__) && !defined(__SC__)
-    OSVERSIONINFO info;
-    wxZeroMemory(info);
+    static int ver = -1, major = -1, minor = -1;
 
-    info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-    if ( ::GetVersionEx(&info) )
+    if ( ver == -1 )
     {
-        if (majorVsn)
-            *majorVsn = info.dwMajorVersion;
-        if (minorVsn)
-            *minorVsn = info.dwMinorVersion;
+        OSVERSIONINFO info;
+        wxZeroMemory(info);
 
-        switch ( info.dwPlatformId )
+        ver = wxWINDOWS;
+        info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+        if ( ::GetVersionEx(&info) )
         {
-            case VER_PLATFORM_WIN32s:
-                return wxWIN32S;
+            major = info.dwMajorVersion;
+            minor = info.dwMinorVersion;
 
-            case VER_PLATFORM_WIN32_WINDOWS:
-                return wxWIN95;
+            switch ( info.dwPlatformId )
+            {
+                case VER_PLATFORM_WIN32s:
+                    ver = wxWIN32S;
+                    break;
 
-            case VER_PLATFORM_WIN32_NT:
-                return wxWINDOWS_NT;
+                case VER_PLATFORM_WIN32_WINDOWS:
+                    ver = wxWIN95;
+                    break;
+
+                case VER_PLATFORM_WIN32_NT:
+                    ver = wxWINDOWS_NT;
+                    break;
+            }
         }
     }
 
-    return wxWINDOWS; // error if we get here, return generic value
+    if (majorVsn && major != -1)
+        *majorVsn = major;
+    if (minorVsn && minor != -1)
+        *minorVsn = minor;
+
+    return ver;
 #else // Win16
     int retValue = wxWINDOWS;
     #ifdef __WINDOWS_386__
@@ -1039,7 +1089,7 @@ void wxSleep(int nSecs)
 // deprecated (in favour of wxLog) log functions
 // ----------------------------------------------------------------------------
 
-#if wxUSE_GUI
+#if WXWIN_COMPATIBILITY_2_2
 
 // Output a debug mess., in a system dependent fashion.
 #ifndef __WXMICROWIN__
@@ -1076,6 +1126,10 @@ void wxFatalError(const wxString& msg, const wxString& title)
 }
 #endif // __WXMICROWIN__
 
+#endif // WXWIN_COMPATIBILITY_2_2
+
+#if wxUSE_GUI
+
 // ----------------------------------------------------------------------------
 // functions to work with .INI files
 // ----------------------------------------------------------------------------
@@ -1448,10 +1502,6 @@ WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd)
 #endif // Win16/32
 }
 
-#endif // wxUSE_GUI
-
-#if wxUSE_GUI
-
 // ----------------------------------------------------------------------------
 // Metafile helpers
 // ----------------------------------------------------------------------------