]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/utils.cpp
Also allow key events for Shift-Tab when wxWANTS_CHARS style is used
[wxWidgets.git] / src / msw / utils.cpp
index 8e5fab3265946128366d2883f4c772c9b9732d0c..7da8065ba3b4c1b7ff1c99ab6279fe40a33c0575 100644 (file)
@@ -34,6 +34,8 @@
 #include "wx/apptrait.h"
 #include "wx/dynload.h"
 
+#include "wx/confbase.h"        // for wxExpandEnvVars()
+
 #include "wx/msw/private.h"     // includes <windows.h>
 #include "wx/msw/missing.h"     // CHARSET_HANGUL
 
     #endif
 #endif
 
+// 260 was taken from windef.h
+#ifndef MAX_PATH
+    #define MAX_PATH  260
+#endif
+
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
@@ -354,8 +361,9 @@ error:
 
 const wxChar* wxGetHomeDir(wxString *pstr)
 {
-  wxString& strDir = *pstr;
+    wxString& strDir = *pstr;
 
+    // first branch is for Cygwin
 #if defined(__UNIX__)
     const wxChar *szHome = wxGetenv("HOME");
     if ( szHome == NULL ) {
@@ -371,34 +379,33 @@ const wxChar* wxGetHomeDir(wxString *pstr)
       strDir << wxT('/');
 
     #ifdef __CYGWIN__
-      // Cygwin returns unix type path but that does not work well
-      static wxChar windowsPath[MAX_PATH];
-      cygwin_conv_to_full_win32_path(strDir, windowsPath);
-      strDir = windowsPath;
+        // Cygwin returns unix type path but that does not work well
+        static wxChar windowsPath[MAX_PATH];
+        cygwin_conv_to_full_win32_path(strDir, windowsPath);
+        strDir = windowsPath;
     #endif
 #elif defined(__WXWINCE__)
       // Nothing
 #else
-    #ifdef  __WIN32__
-      strDir.clear();
+    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 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 )
-      {
+    if ( szHome != NULL )
+    {
         strDir = szHome;
-      }
-      else // no HOME, try HOMEDRIVE/PATH
-      {
-          szHome = wxGetenv(wxT("HOMEDRIVE"));
-          if ( szHome != NULL )
+    }
+    else // no HOME, try HOMEDRIVE/PATH
+    {
+        szHome = wxGetenv(wxT("HOMEDRIVE"));
+        if ( szHome != NULL )
             strDir << szHome;
-          szHome = wxGetenv(wxT("HOMEPATH"));
+        szHome = wxGetenv(wxT("HOMEPATH"));
 
-          if ( szHome != NULL )
-          {
+        if ( szHome != NULL )
+        {
             strDir << szHome;
 
             // the idea is that under NT these variables have default values
@@ -408,44 +415,38 @@ const wxChar* wxGetHomeDir(wxString *pstr)
             // 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();
-          }
-      }
+                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 ( 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 )
+        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 executable directory instead
-    #endif  // WIN16/32
-
-    // 260 was taken from windef.h
-    #ifndef MAX_PATH
-      #define MAX_PATH  260
-    #endif
-
-    wxString strPath;
-    ::GetModuleFileName(::GetModuleHandle(NULL),
-                        wxStringBuffer(strPath, MAX_PATH), MAX_PATH);
+    }
 
-    // extract the dir name
-    wxSplitPath(strPath, &strDir, NULL, NULL);
+    if ( !strDir.empty() )
+    {
+        // sometimes the value of HOME may be "%USERPROFILE%", so reexpand the
+        // value once again, it shouldn't hurt anyhow
+        strDir = wxExpandEnvVars(strDir);
+    }
+    else // fall back to the program directory
+    {
+        wxString strPath;
+        ::GetModuleFileName(::GetModuleHandle(NULL),
+                            wxStringBuffer(strPath, MAX_PATH), MAX_PATH);
 
+        // extract the dir name
+        wxSplitPath(strPath, &strDir, NULL, NULL);
+    }
 #endif  // UNIX/Win
 
-  return strDir.c_str();
+    return strDir.c_str();
 }
 
 wxChar *wxGetUserHome(const wxString& WXUNUSED(user))
@@ -922,7 +923,7 @@ bool wxShutdown(wxShutdownFlags wFlags)
                 return FALSE;
         }
 
-        bOK = ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_REBOOT, 0) != 0;
+        bOK = ::ExitWindowsEx(flags, 0) != 0;
     }
 
     return bOK;
@@ -1244,7 +1245,7 @@ extern long wxCharsetToCodepage(const wxChar *name)
   NULL. classname is the desired wndclass classname. If function succesfully
   registers the class, pclassname will be set to classname.
  */
-extern "C" HWND
+extern "C" WXDLLIMPEXP_BASE HWND
 wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc)
 {
     wxCHECK_MSG( classname && pclassname && wndproc, NULL,