X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..803c55373484d1e2bfed85b46cbbfff8bfad1276:/src/msw/utils.cpp?ds=sidebyside diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index 14346f1413..8e907f1bd2 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -38,7 +38,7 @@ // In some mingws there is a missing extern "C" int the winsock header, // so we put it here just to be safe. Note that this must appear _before_ -// #include "wx/msw/private.h" which itself includes , as this +// #include "wx/msw/private.h" which itself includes , as this // one in turn includes unless we define WIN32_LEAN_AND_MEAN. // #if defined(__WIN32__) && !defined(__TWIN32__) && ! (defined(__GNUWIN32__) && !defined(__MINGW32__)) @@ -423,7 +423,7 @@ const wxChar* wxGetHomeDir(wxString *pstr) return strDir.c_str(); } -wxChar *wxGetUserHome(const wxString& user) +wxChar *wxGetUserHome(const wxString& WXUNUSED(user)) { // VZ: the old code here never worked for user != "" anyhow! Moreover, it // returned sometimes a malloc()'d pointer, sometimes a pointer to a @@ -436,29 +436,14 @@ wxChar *wxGetUserHome(const wxString& user) bool wxDirExists(const wxString& dir) { #if defined(__WIN32__) - WIN32_FIND_DATA fileInfo; + DWORD attribs = GetFileAttributes(dir); + return ((attribs != (DWORD)-1) && (attribs & FILE_ATTRIBUTE_DIRECTORY)); #else // Win16 #ifdef __BORLANDC__ struct ffblk fileInfo; #else struct find_t fileInfo; #endif -#endif // Win32/16 - -#if defined(__WIN32__) - HANDLE h = ::FindFirstFile(dir, &fileInfo); - - if ( h == INVALID_HANDLE_VALUE ) - { - wxLogLastError(wxT("FindFirstFile")); - - return FALSE; - } - - ::FindClose(h); - - return (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; -#else // Win16 // In Borland findfirst has a different argument // ordering from _dos_findfirst. But _dos_findfirst // _should_ be ok in both MS and Borland... why not? @@ -472,11 +457,63 @@ bool wxDirExists(const wxString& dir) #endif // Win32/16 } +// ---------------------------------------------------------------------------- +// env vars +// ---------------------------------------------------------------------------- + +bool wxGetEnv(const wxString& var, wxString *value) +{ +#ifdef __WIN16__ + const wxChar* ret = wxGetenv(var); + if (ret) + { + *value = ret; + return TRUE; + } + else + return FALSE; +#else + // first get the size of the buffer + DWORD dwRet = ::GetEnvironmentVariable(var, NULL, 0); + if ( !dwRet ) + { + // this means that there is no such variable + return FALSE; + } + + if ( value ) + { + (void)::GetEnvironmentVariable(var, value->GetWriteBuf(dwRet), dwRet); + value->UngetWriteBuf(); + } + + return TRUE; +#endif +} + +bool wxSetEnv(const wxString& var, const wxChar *value) +{ + // some compilers have putenv() or _putenv() or _wputenv() but it's better + // to always use Win32 function directly instead of dealing with them +#if defined(__WIN32__) + if ( !::SetEnvironmentVariable(var, value) ) + { + wxLogLastError(_T("SetEnvironmentVariable")); + + return FALSE; + } + + return TRUE; +#else // no way to set env vars + return FALSE; +#endif +} + // ---------------------------------------------------------------------------- // process management // ---------------------------------------------------------------------------- -int wxKill(long pid, int sig) +int wxKill(long WXUNUSED(pid), int WXUNUSED(sig)) { // TODO use SendMessage(WM_QUIT) and TerminateProcess() if needed @@ -547,7 +584,7 @@ wxString wxGetOsDescription() case VER_PLATFORM_WIN32_WINDOWS: str.Printf(_("Windows 9%c"), - info.dwMinorVersion == 0 ? _T('5') : _T('9')); + info.dwMinorVersion == 0 ? _T('5') : _T('8')); if ( !wxIsEmpty(info.szCSDVersion) ) { str << _T(" (") << info.szCSDVersion << _T(')'); @@ -591,7 +628,7 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn) *majorVsn = info.dwMajorVersion; if (minorVsn) *minorVsn = info.dwMinorVersion; - + switch ( info.dwPlatformId ) { case VER_PLATFORM_WIN32s: @@ -951,6 +988,8 @@ wxChar *wxLoadUserResource(const wxString& resourceName, const wxString& resourc // get display info // ---------------------------------------------------------------------------- +// See also the wxGetMousePosition in window.cpp +// Deprecated: use wxPoint wxGetMousePosition() instead void wxGetMousePosition( int* x, int* y ) { POINT pt; @@ -962,10 +1001,22 @@ void wxGetMousePosition( int* x, int* y ) // Return TRUE if we have a colour display bool wxColourDisplay() { - ScreenHDC dc; - int noCols = GetDeviceCaps(dc, NUMCOLORS); + // this function is called from wxDC ctor so it is called a *lot* of times + // hence we optimize it a bit but doign the check only once + // + // this should be MT safe as only the GUI thread (holding the GUI mutex) + // can call us + static int s_isColour = -1; + + if ( s_isColour == -1 ) + { + ScreenHDC dc; + int noCols = ::GetDeviceCaps(dc, NUMCOLORS); + + s_isColour = (noCols == -1) || (noCols > 2); + } - return (noCols == -1) || (noCols > 2); + return s_isColour != 0; } // Returns depth of screen @@ -984,6 +1035,33 @@ void wxDisplaySize(int *width, int *height) if ( height ) *height = GetDeviceCaps(dc, VERTRES); } +void wxDisplaySizeMM(int *width, int *height) +{ + ScreenHDC dc; + + if ( width ) *width = GetDeviceCaps(dc, HORZSIZE); + if ( height ) *height = GetDeviceCaps(dc, VERTSIZE); +} + +void wxClientDisplayRect(int *x, int *y, int *width, int *height) +{ +#ifdef __WIN16__ + *x = 0; *y = 0; + wxDisplaySize(width, height); +#else + // Determine the desktop dimensions minus the taskbar and any other + // special decorations... + RECT r; + + SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); + if (x) *x = r.left; + if (y) *y = r.top; + if (width) *width = r.right - r.left; + if (height) *height = r.bottom - r.top; +#endif +} + + // --------------------------------------------------------------------------- // window information functions // --------------------------------------------------------------------------- @@ -1044,9 +1122,9 @@ wxString WXDLLEXPORT wxGetWindowClass(WXHWND hWnd) WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd) { #ifndef __WIN32__ - return GetWindowWord((HWND)hWnd, GWW_ID); + return (WXWORD)GetWindowWord((HWND)hWnd, GWW_ID); #else // Win32 - return GetWindowLong((HWND)hWnd, GWL_ID); + return (WXWORD)GetWindowLong((HWND)hWnd, GWL_ID); #endif // Win16/32 }