X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ffcb4ee424061633cedc1c0ba6c04180d5048da9..eed9e4791274d68ea1fb0c556bf3199ecf88a7d9:/src/msw/utils.cpp diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index e3de12da51..3e3721f596 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -34,10 +34,13 @@ #include "wx/apptrait.h" #include "wx/dynload.h" +#include "wx/confbase.h" // for wxExpandEnvVars() + #include "wx/msw/private.h" // includes #include "wx/msw/missing.h" // CHARSET_HANGUL -#if defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) +#if defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) \ + || defined(__CYGWIN32__) // apparently we need to include winsock.h to get WSADATA and other stuff // used in wxGetFullHostName() with the old mingw32 versions #include @@ -91,6 +94,11 @@ #endif #endif +// 260 was taken from windef.h +#ifndef MAX_PATH + #define MAX_PATH 260 +#endif + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -148,7 +156,10 @@ bool wxGetFullHostName(wxChar *buf, int maxSize) // TODO should use GetComputerNameEx() when available // we don't want to always link with Winsock DLL as we might not use it at - // all, so load it dynamically here if needed + // all, so load it dynamically here if needed (and don't complain if it is + // missing, we handle this) + wxLogNull noLog; + wxDynamicLibrary dllWinsock(_T("ws2_32.dll"), wxDL_VERBATIM); if ( dllWinsock.IsLoaded() ) { @@ -353,8 +364,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 ) { @@ -370,34 +382,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 @@ -407,44 +418,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)) @@ -921,7 +926,7 @@ bool wxShutdown(wxShutdownFlags wFlags) return FALSE; } - bOK = ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_REBOOT, 0) != 0; + bOK = ::ExitWindowsEx(flags, 0) != 0; } return bOK; @@ -1051,12 +1056,12 @@ wxToolkitInfo& wxAppTraits::GetToolkitInfo() case VER_PLATFORM_WIN32_CE: s_ver = wxWINDOWS_CE; break; -#endif +#endif } } } - static wxToolkitInfo info; + static wxToolkitInfo info; info.versionMajor = s_major; info.versionMinor = s_minor; info.os = s_ver; @@ -1231,3 +1236,62 @@ extern long wxCharsetToCodepage(const wxChar *name) #endif // wxUSE_FONTMAP/!wxUSE_FONTMAP +/* + Creates a hidden window with supplied window proc registering the class for + it if necesssary (i.e. the first time only). Caller is responsible for + destroying the window and unregistering the class (note that this must be + done because wxWindows may be used as a DLL and so may be loaded/unloaded + multiple times into/from the same process so we cna't rely on automatic + Windows class unregistration). + + pclassname is a pointer to a caller stored classname, which must initially be + NULL. classname is the desired wndclass classname. If function succesfully + registers the class, pclassname will be set to classname. + */ +extern "C" WXDLLIMPEXP_BASE HWND +wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc) +{ + wxCHECK_MSG( classname && pclassname && wndproc, NULL, + _T("NULL parameter in wxCreateHiddenWindow") ); + + // register the class fi we need to first + if ( *pclassname == NULL ) + { + WNDCLASS wndclass; + wxZeroMemory(wndclass); + + wndclass.lpfnWndProc = wndproc; + wndclass.hInstance = wxGetInstance(); + wndclass.lpszClassName = classname; + + if ( !::RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass() in wxCreateHiddenWindow")); + + return NULL; + } + + *pclassname = classname; + } + + // next create the window + HWND hwnd = ::CreateWindow + ( + *pclassname, + NULL, + 0, 0, 0, 0, + 0, + (HWND) NULL, + (HMENU)NULL, + wxGetInstance(), + (LPVOID) NULL + ); + + if ( !hwnd ) + { + wxLogLastError(wxT("CreateWindow() in wxCreateHiddenWindow")); + } + + return hwnd; +} +