X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/57c208c5759da71a637f0f0f5b7d3dc3eda09c02..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/msw/utils.cpp?ds=sidebyside diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index a42f71bca7..8b36c7a3de 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -17,14 +17,14 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP -#include "wx/setup.h" -#include "wx/utils.h" -#include "wx/app.h" -#include "wx/cursor.h" + #include "wx/setup.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/cursor.h" #endif //WX_PRECOMP #include "wx/msw/private.h" @@ -35,17 +35,17 @@ #include -#if !defined(__GNUWIN32__) && !defined(__SALFORDC__) -#include +#if !defined(__GNUWIN32__) && !defined(__WXWINE__) && !defined(__SALFORDC__) + #include -#ifndef __MWERKS__ -#include -#endif + #ifndef __MWERKS__ + #include + #endif #endif //GNUWIN32 #if defined(__GNUWIN32__) && !defined(__TWIN32__) -#include -#include + #include + #include #endif //GNUWIN32 #include "wx/log.h" @@ -53,56 +53,52 @@ #ifdef __BORLANDC__ // Please someone tell me which version of Borland needs // this (3.1 I believe) and how to test for it. // If this works for Borland 4.0 as well, then no worries. -#include + #include #endif -#ifdef __WIN32__ -#include +// VZ: there is some code using NetXXX() functions to get the full user name: +// I don't think it's a good idea because they don't work under Win95 and +// seem to return the same as wxGetUserId() under NT. If you really want +// to use them, just #define USE_NET_API +#undef USE_NET_API -#ifndef __GNUWIN32__ -#include -#endif +#ifdef USE_NET_API + #include +#endif // USE_NET_API + +#if defined(__WIN32__) && !defined(__WXWINE__) + #include + + #ifndef __GNUWIN32__ + #include + #endif #endif #include #include #include #ifndef __WATCOMC__ -#if !(defined(_MSC_VER) && (_MSC_VER > 800)) -#include -#endif + #if !(defined(_MSC_VER) && (_MSC_VER > 800)) + #include + #endif #endif #include //// BEGIN for console support: VC++ only +#ifdef __VISUALC__ -#if defined(__WXDEBUG__) && !defined(__WIN16__) && defined(_MSC_VER) && !defined(__NO_VC_CRTDBG__) - #define wxUSE_VC_CRTDBG -#else - #undef wxUSE_VC_CRTDBG -#endif +#include "wx/msw/msvcrt.h" -#ifdef wxUSE_VC_CRTDBG - // VC++ uses this macro as debug/release mode indicator - #ifndef _DEBUG - #define _DEBUG - #endif +#include - #include +#include "wx/ioswrap.h" #if wxUSE_IOSTREAMH // N.B. BC++ doesn't have istream.h, ostream.h -# include # include # include - #else -# include -# include # include -# ifdef _MSC_VER - using namespace std; -# endif #endif /* Need to undef new if including crtdbg.h */ @@ -119,14 +115,14 @@ # endif #endif - + // __VISUALC__ /// END for console support // In the WIN.INI file -static const char WX_SECTION[] = "wxWindows"; -static const char eHOSTNAME[] = "HostName"; -static const char eUSERID[] = "UserId"; -static const char eUSERNAME[] = "UserName"; +static const wxChar WX_SECTION[] = wxT("wxWindows"); +static const wxChar eHOSTNAME[] = wxT("HostName"); +static const wxChar eUSERID[] = wxT("UserId"); +static const wxChar eUSERNAME[] = wxT("UserName"); // For the following functions we SHOULD fill in support // for Windows-NT (which I don't know) as I assume it begin @@ -134,104 +130,64 @@ static const char eUSERNAME[] = "UserName"; // functions beyond those provided by WinSock // Get full hostname (eg. DoDo.BSn-Germany.crg.de) -bool wxGetHostName(char *buf, int maxSize) +bool wxGetHostName(wxChar *buf, int maxSize) { #if defined(__WIN32__) && !defined(__TWIN32__) DWORD nSize = maxSize; return (::GetComputerName(buf, &nSize) != 0); #else - char *sysname; - const char *default_host = "noname"; + wxChar *sysname; + const wxChar *default_host = wxT("noname"); - if ((sysname = getenv("SYSTEM_NAME")) == NULL) { + if ((sysname = wxGetenv(wxT("SYSTEM_NAME"))) == NULL) { GetProfileString(WX_SECTION, eHOSTNAME, default_host, buf, maxSize - 1); } else - strncpy(buf, sysname, maxSize - 1); - buf[maxSize] = '\0'; + wxStrncpy(buf, sysname, maxSize - 1); + buf[maxSize] = wxT('\0'); return *buf ? TRUE : FALSE; #endif } // Get user ID e.g. jacs -bool wxGetUserId(char *buf, int maxSize) +bool wxGetUserId(wxChar *buf, int maxSize) { #if defined(__WIN32__) && !defined(__win32s__) && !defined(__TWIN32__) - - // VZ: why should it be so complicated?? -#if 0 - // Gets the current user's full name according to the MS article PSS ID - // Number: Q119670 - // Seems to be the same as the login name for me? - char *UserName = new char[256]; - char *Domain = new char[256]; - DWORD maxCharacters = 255; - GetUserName( UserName, &maxCharacters ); - GetComputerName( Domain, &maxCharacters ); - - WCHAR wszUserName[256]; // Unicode user name - WCHAR wszDomain[256]; - LPBYTE ComputerName; - - struct _SERVER_INFO_100 *si100; // Server structure - struct _USER_INFO_2 *ui; // User structure - - // Convert ASCII user name and domain to Unicode. - - MultiByteToWideChar( CP_ACP, 0, UserName, - strlen(UserName)+1, wszUserName, sizeof(wszUserName) ); - MultiByteToWideChar( CP_ACP, 0, Domain, - strlen(Domain)+1, wszDomain, sizeof(wszDomain) ); - - // Get the computer name of a DC for the specified domain. - // >If you get a link error on this, include netapi32.lib< - - NetGetDCName( NULL, wszDomain, &ComputerName ); - - // Look up the user on the DC. - - if(NetUserGetInfo( (LPWSTR) ComputerName, - (LPWSTR) &wszUserName, 2, (LPBYTE *) &ui)) - { - printf( "Error getting user information.\n" ); - return( FALSE ); - } - - // Convert the Unicode full name to ASCII. - - WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name, - -1, buf, 256, NULL, NULL ); - } - return( TRUE ); -#else // 1 DWORD nSize = maxSize; if ( ::GetUserName(buf, &nSize) == 0 ) { - wxLogSysError("Can not get user name"); - - return FALSE; + // actually, it does happen on Win9x if the user didn't log on + DWORD res = ::GetEnvironmentVariable(wxT("username"), buf, maxSize); + if ( res == 0 ) + { + // not found + return FALSE; + } } return TRUE; -#endif // 0/1 - #else // Win16 or Win32s - char *user; - const char *default_id = "anonymous"; + wxChar *user; + const wxChar *default_id = wxT("anonymous"); // Can't assume we have NIS (PC-NFS) or some other ID daemon // So we ... - if ( (user = getenv("USER")) == NULL && - (user = getenv("LOGNAME")) == NULL ) { + if ( (user = wxGetenv(wxT("USER"))) == NULL && + (user = wxGetenv(wxT("LOGNAME"))) == NULL ) + { // Use wxWindows configuration data (comming soon) GetProfileString(WX_SECTION, eUSERID, default_id, buf, maxSize - 1); - } else - strncpy(buf, user, maxSize - 1); + } + else + { + wxStrncpy(buf, user, maxSize - 1); + } + return *buf ? TRUE : FALSE; #endif } // Get user name e.g. Julian Smart -bool wxGetUserName(char *buf, int maxSize) +bool wxGetUserName(wxChar *buf, int maxSize) { #if wxUSE_PENWINDOWS && !defined(__WATCOMC__) && !defined(__GNUWIN32__) extern HANDLE g_hPenWin; // PenWindows Running? @@ -245,9 +201,76 @@ bool wxGetUserName(char *buf, int maxSize) else #endif { +#ifdef USE_NET_API + CHAR szUserName[256]; + if ( !wxGetUserId(szUserName, WXSIZEOF(szUserName)) ) + return FALSE; + + // TODO how to get the domain name? + CHAR *szDomain = ""; + + // the code is based on the MSDN example (also see KB article Q119670) + WCHAR wszUserName[256]; // Unicode user name + WCHAR wszDomain[256]; + LPBYTE ComputerName; + + USER_INFO_2 *ui2; // User structure + + // Convert ANSI user name and domain to Unicode + MultiByteToWideChar( CP_ACP, 0, szUserName, strlen(szUserName)+1, + wszUserName, WXSIZEOF(wszUserName) ); + MultiByteToWideChar( CP_ACP, 0, szDomain, strlen(szDomain)+1, + wszDomain, WXSIZEOF(wszDomain) ); + + // Get the computer name of a DC for the domain. + if ( NetGetDCName( NULL, wszDomain, &ComputerName ) != NERR_Success ) + { + wxLogError(wxT("Can not find domain controller")); + + goto error; + } + + // Look up the user on the DC + NET_API_STATUS status = NetUserGetInfo( (LPWSTR)ComputerName, + (LPWSTR)&wszUserName, + 2, // level - we want USER_INFO_2 + (LPBYTE *) &ui2 ); + switch ( status ) + { + case NERR_Success: + // ok + break; + + case NERR_InvalidComputer: + wxLogError(wxT("Invalid domain controller name.")); + + goto error; + + case NERR_UserNotFound: + wxLogError(wxT("Invalid user name '%s'."), szUserName); + + goto error; + + default: + wxLogSysError(wxT("Can't get information about user")); + + goto error; + } + + // Convert the Unicode full name to ANSI + WideCharToMultiByte( CP_ACP, 0, ui2->usri2_full_name, -1, + buf, maxSize, NULL, NULL ); + + return TRUE; + +error: + wxLogError(wxT("Couldn't look up full user name.")); + + return FALSE; +#else // !USE_NET_API // Could use NIS, MS-Mail or other site specific programs // Use wxWindows configuration data - bool ok = GetProfileString(WX_SECTION, eUSERNAME, "", buf, maxSize - 1) != 0; + bool ok = GetProfileString(WX_SECTION, eUSERNAME, wxT(""), buf, maxSize - 1) != 0; if ( !ok ) { ok = wxGetUserId(buf, maxSize); @@ -255,8 +278,9 @@ bool wxGetUserName(char *buf, int maxSize) if ( !ok ) { - strncpy(buf, "Unknown User", maxSize); + wxStrncpy(buf, wxT("Unknown User"), maxSize); } +#endif // Win32/16 } return TRUE; @@ -273,21 +297,21 @@ int wxKill(long pid, int sig) bool wxShell(const wxString& command) { - char *shell; - if ((shell = getenv("COMSPEC")) == NULL) - shell = "\\COMMAND.COM"; + wxChar *shell; + if ((shell = wxGetenv(wxT("COMSPEC"))) == NULL) + shell = wxT("\\COMMAND.COM"); - char tmp[255]; - if (command != "") - sprintf(tmp, "%s /c %s", shell, WXSTRINGCAST command); + wxChar tmp[255]; + if (command != wxT("")) + wxSprintf(tmp, wxT("%s /c %s"), shell, WXSTRINGCAST command); else - strcpy(tmp, shell); + wxStrcpy(tmp, shell); - return (wxExecute((char *)tmp, FALSE) != 0); + return (wxExecute((wxChar *)tmp, FALSE) != 0); } // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) -long wxGetFreeMemory(void) +long wxGetFreeMemory() { #if defined(__WIN32__) && !defined(__BORLANDC__) && !defined(__TWIN32__) MEMORYSTATUS memStatus; @@ -304,7 +328,7 @@ static bool inTimer = FALSE; class wxSleepTimer: public wxTimer { public: - inline void Notify(void) + inline void Notify() { inTimer = FALSE; Stop(); @@ -313,6 +337,27 @@ class wxSleepTimer: public wxTimer static wxTimer *wxTheSleepTimer = NULL; +void wxUsleep(unsigned long milliseconds) +{ +#ifdef __WIN32__ + ::Sleep(milliseconds); +#else + if (inTimer) + return; + + wxTheSleepTimer = new wxSleepTimer; + inTimer = TRUE; + wxTheSleepTimer->Start(milliseconds); + while (inTimer) + { + if (wxTheApp->Pending()) + wxTheApp->Dispatch(); + } + delete wxTheSleepTimer; + wxTheSleepTimer = NULL; +#endif +} + void wxSleep(int nSecs) { #if 0 // WIN32 hangs app @@ -335,16 +380,16 @@ void wxSleep(int nSecs) } // Consume all events until no more left -void wxFlushEvents(void) +void wxFlushEvents() { // wxYield(); } // Output a debug mess., in a system dependent fashion. -void wxDebugMsg(const char *fmt ...) +void wxDebugMsg(const wxChar *fmt ...) { va_list ap; - static char buffer[512]; + static wxChar buffer[512]; if (!wxTheApp->GetWantDebugOutput()) return ; @@ -352,7 +397,7 @@ void wxDebugMsg(const char *fmt ...) va_start(ap, fmt); wvsprintf(buffer,fmt,ap) ; - OutputDebugString((LPCSTR)buffer) ; + OutputDebugString((LPCTSTR)buffer) ; va_end(ap); } @@ -360,8 +405,8 @@ void wxDebugMsg(const char *fmt ...) // Non-fatal error: pop up message box and (possibly) continue void wxError(const wxString& msg, const wxString& title) { - sprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST msg); - if (MessageBox(NULL, (LPCSTR)wxBuffer, (LPCSTR)WXSTRINGCAST title, + wxSprintf(wxBuffer, wxT("%s\nContinue?"), WXSTRINGCAST msg); + if (MessageBox(NULL, (LPCTSTR)wxBuffer, (LPCTSTR)WXSTRINGCAST title, MB_ICONSTOP | MB_YESNO) == IDNO) wxExit(); } @@ -369,12 +414,12 @@ void wxError(const wxString& msg, const wxString& title) // Fatal error: pop up message box and abort void wxFatalError(const wxString& msg, const wxString& title) { - sprintf(wxBuffer, "%s: %s", WXSTRINGCAST title, WXSTRINGCAST msg); - FatalAppExit(0, (LPCSTR)wxBuffer); + wxSprintf(wxBuffer, wxT("%s: %s"), WXSTRINGCAST title, WXSTRINGCAST msg); + FatalAppExit(0, (LPCTSTR)wxBuffer); } // Emit a beeeeeep -void wxBell(void) +void wxBell() { // Removed by RD because IHMO syncronous sound is a Bad Thing. MessageBeep // will do a similar thing anyway if there is no sound card... @@ -389,7 +434,6 @@ void wxBell(void) // detect WindowsNT correctly int wxGetOsVersion(int *majorVsn, int *minorVsn) { - extern char *wxOsVersion; if (majorVsn) *majorVsn = 0; if (minorVsn) *minorVsn = 0; @@ -437,48 +481,54 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn) #if wxUSE_RESOURCES bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file) { - if (file != "") - return (WritePrivateProfileString((LPCSTR)WXSTRINGCAST section, (LPCSTR)WXSTRINGCAST entry, (LPCSTR)value, (LPCSTR)WXSTRINGCAST file) != 0); + if (file != wxT("")) +// Don't know what the correct cast should be, but it doesn't +// compile in BC++/16-bit without this cast. +#if !defined(__WIN32__) + return (WritePrivateProfileString((const char*) section, (const char*) entry, (const char*) value, (const char*) file) != 0); +#else + return (WritePrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)value, (LPCTSTR)WXSTRINGCAST file) != 0); +#endif else - return (WriteProfileString((LPCSTR)WXSTRINGCAST section, (LPCSTR)WXSTRINGCAST entry, (LPCSTR)WXSTRINGCAST value) != 0); + return (WriteProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)WXSTRINGCAST value) != 0); } bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file) { - char buf[50]; - sprintf(buf, "%.4f", value); + wxChar buf[50]; + wxSprintf(buf, wxT("%.4f"), value); return wxWriteResource(section, entry, buf, file); } bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file) { - char buf[50]; - sprintf(buf, "%ld", value); + wxChar buf[50]; + wxSprintf(buf, wxT("%ld"), value); return wxWriteResource(section, entry, buf, file); } bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file) { - char buf[50]; - sprintf(buf, "%d", value); + wxChar buf[50]; + wxSprintf(buf, wxT("%d"), value); return wxWriteResource(section, entry, buf, file); } -bool wxGetResource(const wxString& section, const wxString& entry, char **value, const wxString& file) +bool wxGetResource(const wxString& section, const wxString& entry, wxChar **value, const wxString& file) { - static const char defunkt[] = "$$default"; - if (file != "") + static const wxChar defunkt[] = wxT("$$default"); + if (file != wxT("")) { - int n = GetPrivateProfileString((LPCSTR)WXSTRINGCAST section, (LPCSTR)WXSTRINGCAST entry, (LPCSTR)defunkt, - (LPSTR)wxBuffer, 1000, (LPCSTR)WXSTRINGCAST file); - if (n == 0 || strcmp(wxBuffer, defunkt) == 0) + int n = GetPrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt, + (LPTSTR)wxBuffer, 1000, (LPCTSTR)WXSTRINGCAST file); + if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0) return FALSE; } else { - int n = GetProfileString((LPCSTR)WXSTRINGCAST section, (LPCSTR)WXSTRINGCAST entry, (LPCSTR)defunkt, - (LPSTR)wxBuffer, 1000); - if (n == 0 || strcmp(wxBuffer, defunkt) == 0) + int n = GetProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt, + (LPTSTR)wxBuffer, 1000); + if (n == 0 || wxStrcmp(wxBuffer, defunkt) == 0) return FALSE; } if (*value) delete[] (*value); @@ -488,11 +538,11 @@ bool wxGetResource(const wxString& section, const wxString& entry, char **value, bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file) { - char *s = NULL; - bool succ = wxGetResource(section, entry, (char **)&s, file); + wxChar *s = NULL; + bool succ = wxGetResource(section, entry, (wxChar **)&s, file); if (succ) { - *value = (float)strtod(s, NULL); + *value = (float)wxStrtod(s, NULL); delete[] s; return TRUE; } @@ -501,11 +551,11 @@ bool wxGetResource(const wxString& section, const wxString& entry, float *value, bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file) { - char *s = NULL; - bool succ = wxGetResource(section, entry, (char **)&s, file); + wxChar *s = NULL; + bool succ = wxGetResource(section, entry, (wxChar **)&s, file); if (succ) { - *value = strtol(s, NULL, 10); + *value = wxStrtol(s, NULL, 10); delete[] s; return TRUE; } @@ -514,11 +564,11 @@ bool wxGetResource(const wxString& section, const wxString& entry, long *value, bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file) { - char *s = NULL; - bool succ = wxGetResource(section, entry, (char **)&s, file); + wxChar *s = NULL; + bool succ = wxGetResource(section, entry, (wxChar **)&s, file); if (succ) { - *value = (int)strtol(s, NULL, 10); + *value = (int)wxStrtol(s, NULL, 10); delete[] s; return TRUE; } @@ -526,67 +576,69 @@ bool wxGetResource(const wxString& section, const wxString& entry, int *value, c } #endif // wxUSE_RESOURCES -// Old cursor -static HCURSOR wxBusyCursorOld = 0; -static int wxBusyCursorCount = 0; +// --------------------------------------------------------------------------- +// helper functions for showing a "busy" cursor +// --------------------------------------------------------------------------- + +HCURSOR gs_wxBusyCursor = 0; // new, busy cursor +HCURSOR gs_wxBusyCursorOld = 0; // old cursor +static int gs_wxBusyCursorCount = 0; // Set the cursor to the busy cursor for all windows void wxBeginBusyCursor(wxCursor *cursor) { - wxBusyCursorCount ++; - if (wxBusyCursorCount == 1) - { - wxBusyCursorOld = ::SetCursor((HCURSOR) cursor->GetHCURSOR()); - } - else - { - (void)::SetCursor((HCURSOR) cursor->GetHCURSOR()); - } + if ( gs_wxBusyCursorCount++ == 0 ) + { + gs_wxBusyCursor = (HCURSOR)cursor->GetHCURSOR(); + gs_wxBusyCursorOld = ::SetCursor(gs_wxBusyCursor); + } + //else: nothing to do, already set } // Restore cursor to normal -void wxEndBusyCursor(void) +void wxEndBusyCursor() { - if (wxBusyCursorCount == 0) - return; + wxCHECK_RET( gs_wxBusyCursorCount > 0, + wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); - wxBusyCursorCount --; - if (wxBusyCursorCount == 0) - { - ::SetCursor(wxBusyCursorOld); - wxBusyCursorOld = 0; - } + if ( --gs_wxBusyCursorCount == 0 ) + { + ::SetCursor(gs_wxBusyCursorOld); + + gs_wxBusyCursorOld = 0; + } } // TRUE if we're between the above two calls -bool wxIsBusy(void) +bool wxIsBusy() { - return (wxBusyCursorCount > 0); + return (gs_wxBusyCursorCount > 0); } -const char* wxGetHomeDir(wxString *pstr) +// --------------------------------------------------------------------------- +const wxChar* wxGetHomeDir(wxString *pstr) { wxString& strDir = *pstr; #if defined(__UNIX__) && !defined(__TWIN32__) - const char *szHome = getenv("HOME"); + const wxChar *szHome = wxGetenv("HOME"); if ( szHome == NULL ) { // we're homeless... wxLogWarning(_("can't find user's HOME, using current directory.")); - strDir = "."; + strDir = wxT("."); } else strDir = szHome; // add a trailing slash if needed - if ( strDir.Last() != '/' ) - strDir << '/'; + if ( strDir.Last() != wxT('/') ) + strDir << wxT('/'); #else // Windows #ifdef __WIN32__ - const char *szHome = getenv("HOMEDRIVE"); + const wxChar *szHome = wxGetenv(wxT("HOMEDRIVE")); if ( szHome != NULL ) strDir << szHome; - szHome = getenv("HOMEPATH"); + szHome = wxGetenv(wxT("HOMEPATH")); if ( szHome != NULL ) { strDir << szHome; @@ -596,7 +648,7 @@ const char* wxGetHomeDir(wxString *pstr) // 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 ( strcmp(szHome, "\\") != 0 ) + if ( wxStrcmp(szHome, wxT("\\")) != 0 ) return strDir.c_str(); } @@ -623,29 +675,29 @@ const char* wxGetHomeDir(wxString *pstr) } // Hack for MS-DOS -char *wxGetUserHome (const wxString& user) +wxChar *wxGetUserHome (const wxString& user) { - char *home; + wxChar *home; wxString user1(user); - if (user1 != "") { - char tmp[64]; + if (user1 != wxT("")) { + wxChar tmp[64]; if (wxGetUserId(tmp, sizeof(tmp)/sizeof(char))) { // Guests belong in the temp dir - if (Stricmp(tmp, "annonymous") == 0) { - if ((home = getenv("TMP")) != NULL || - (home = getenv("TMPDIR")) != NULL || - (home = getenv("TEMP")) != NULL) - return *home ? home : "\\"; + if (wxStricmp(tmp, wxT("annonymous")) == 0) { + if ((home = wxGetenv(wxT("TMP"))) != NULL || + (home = wxGetenv(wxT("TMPDIR"))) != NULL || + (home = wxGetenv(wxT("TEMP"))) != NULL) + return *home ? home : (wxChar*)wxT("\\"); } - if (Stricmp(tmp, WXSTRINGCAST user1) == 0) - user1 = ""; + if (wxStricmp(tmp, WXSTRINGCAST user1) == 0) + user1 = wxT(""); } } - if (user1 == "") - if ((home = getenv("HOME")) != NULL) + if (user1 == wxT("")) + if ((home = wxGetenv(wxT("HOME"))) != NULL) { - strcpy(wxBuffer, home); + wxStrcpy(wxBuffer, home); Unix2DosFilename(wxBuffer); return wxBuffer; } @@ -666,7 +718,8 @@ bool wxCheckForInterrupt(wxWindow *wnd) return TRUE;//*** temporary? } else{ - wxError("wnd==NULL !!!"); + wxFAIL_MSG(wxT("wnd==NULL !!!")); + return FALSE;//*** temporary? } } @@ -675,9 +728,9 @@ bool wxCheckForInterrupt(wxWindow *wnd) // Returns NULL or newly-allocated memory, so use delete[] to clean up. #ifdef __WXMSW__ -char *wxLoadUserResource(const wxString& resourceName, const wxString& resourceType) +wxChar *wxLoadUserResource(const wxString& resourceName, const wxString& resourceType) { - char *s = NULL; + wxChar *s = NULL; #if !defined(__WIN32__) || defined(__TWIN32__) HRSRC hResource = ::FindResource(wxGetInstance(), WXSTRINGCAST resourceName, WXSTRINGCAST resourceType); #else @@ -693,7 +746,7 @@ char *wxLoadUserResource(const wxString& resourceName, const wxString& resourceT HGLOBAL hData = ::LoadResource(wxGetInstance(), hResource); if (hData == 0) return NULL; - char *theText = (char *)LockResource(hData); + wxChar *theText = (wxChar *)LockResource(hData); if (!theText) return NULL; @@ -720,7 +773,7 @@ void wxGetMousePosition( int* x, int* y ) }; // Return TRUE if we have a colour display -bool wxColourDisplay(void) +bool wxColourDisplay() { HDC dc = ::GetDC((HWND) NULL); bool flag; @@ -734,7 +787,7 @@ bool wxColourDisplay(void) } // Returns depth of screen -int wxDisplayDepth(void) +int wxDisplayDepth() { HDC dc = ::GetDC((HWND) NULL); int planes = GetDeviceCaps(dc, PLANES); @@ -766,14 +819,14 @@ bool wxDirExists(const wxString& dir) #endif #if defined(__WIN32__) - HANDLE h = FindFirstFile((LPTSTR) WXSTRINGCAST dir,(LPWIN32_FIND_DATA)&fileInfo); - - if (h==INVALID_HANDLE_VALUE) - return FALSE; - else { - FindClose(h); - return ((fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY); - } + HANDLE h = FindFirstFile((LPTSTR) WXSTRINGCAST dir,(LPWIN32_FIND_DATA)&fileInfo); + + if (h==INVALID_HANDLE_VALUE) + return FALSE; + else { + FindClose(h); + return ((fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY); + } #else // In Borland findfirst has a different argument // ordering from _dos_findfirst. But _dos_findfirst @@ -786,6 +839,10 @@ bool wxDirExists(const wxString& dir) #endif } +// --------------------------------------------------------------------------- +// window information functions +// --------------------------------------------------------------------------- + wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd) { wxString str; @@ -796,6 +853,58 @@ wxString WXDLLEXPORT wxGetWindowText(WXHWND hWnd) return str; } +wxString WXDLLEXPORT wxGetWindowClass(WXHWND hWnd) +{ + wxString str; + + int len = 256; // some starting value + + for ( ;; ) + { + // as we've #undefined GetClassName we must now manually choose the + // right function to call + int count = + + #ifndef __WIN32__ + GetClassName + #else // Win32 + #ifdef UNICODE + GetClassNameW + #else // !Unicode + #ifdef __TWIN32__ + GetClassName + #else // !Twin32 + GetClassNameA + #endif // Twin32/!Twin32 + #endif // Unicode/ANSI + #endif // Win16/32 + ((HWND)hWnd, str.GetWriteBuf(len), len); + + str.UngetWriteBuf(); + if ( count == len ) + { + // the class name might have been truncated, retry with larger + // buffer + len *= 2; + } + else + { + break; + } + } + + return str; +} + +WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd) +{ +#ifndef __WIN32__ + return GetWindowWord((HWND)hWnd, GWW_ID); +#else // Win32 + return GetWindowLong((HWND)hWnd, GWL_ID); +#endif // Win16/32 +} + #if 0 //------------------------------------------------------------------------ // wild character routines @@ -806,13 +915,13 @@ bool wxIsWild( const wxString& pattern ) wxString tmp = pattern; char *pat = WXSTRINGCAST(tmp); while (*pat) { - switch (*pat++) { - case '?': case '*': case '[': case '{': - return TRUE; - case '\\': - if (!*pat++) - return FALSE; - } + switch (*pat++) { + case '?': case '*': case '[': case '{': + return TRUE; + case '\\': + if (!*pat++) + return FALSE; + } } return FALSE; }; @@ -832,271 +941,137 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) // dot_special means '.' only matches '.' if (dot_special && *str == '.' && *pattern != *str) - return FALSE; + return FALSE; while ((*pattern != '\0') && (!done) && (((*str=='\0')&&((*pattern==OB)||(*pattern=='*')))||(*str!='\0'))) { - switch (*pattern) { - case '\\': - pattern++; - if (*pattern != '\0') - pattern++; - break; - case '*': - pattern++; - ret_code = FALSE; - while ((*str!='\0') - && (!(ret_code=wxMatchWild(pattern, str++, FALSE)))) - /*loop*/; - if (ret_code) { - while (*str != '\0') - str++; - while (*pattern != '\0') - pattern++; - } - break; - case '[': - pattern++; - repeat: - if ((*pattern == '\0') || (*pattern == ']')) { - done = TRUE; - break; - } - if (*pattern == '\\') { - pattern++; - if (*pattern == '\0') { - done = TRUE; - break; - } - } - if (*(pattern + 1) == '-') { - c = *pattern; - pattern += 2; - if (*pattern == ']') { - done = TRUE; - break; - } - if (*pattern == '\\') { - pattern++; - if (*pattern == '\0') { - done = TRUE; - break; - } - } - if ((*str < c) || (*str > *pattern)) { - pattern++; - goto repeat; - } - } else if (*pattern != *str) { - pattern++; - goto repeat; - } - pattern++; - while ((*pattern != ']') && (*pattern != '\0')) { - if ((*pattern == '\\') && (*(pattern + 1) != '\0')) - pattern++; - pattern++; - } - if (*pattern != '\0') { - pattern++, str++; - } - break; - case '?': - pattern++; - str++; - break; - case OB: - pattern++; - while ((*pattern != CB) && (*pattern != '\0')) { - cp = str; - ok = TRUE; - while (ok && (*cp != '\0') && (*pattern != '\0') - && (*pattern != ',') && (*pattern != CB)) { - if (*pattern == '\\') - pattern++; - ok = (*pattern++ == *cp++); - } - if (*pattern == '\0') { - ok = FALSE; - done = TRUE; - break; - } else if (ok) { - str = cp; - while ((*pattern != CB) && (*pattern != '\0')) { - if (*++pattern == '\\') { - if (*++pattern == CB) - pattern++; - } - } - } else { - while (*pattern!=CB && *pattern!=',' && *pattern!='\0') { - if (*++pattern == '\\') { - if (*++pattern == CB || *pattern == ',') - pattern++; - } - } - } - if (*pattern != '\0') - pattern++; - } - break; - default: - if (*str == *pattern) { - str++, pattern++; - } else { - done = TRUE; - } - } + switch (*pattern) { + case '\\': + pattern++; + if (*pattern != '\0') + pattern++; + break; + case '*': + pattern++; + ret_code = FALSE; + while ((*str!='\0') + && (!(ret_code=wxMatchWild(pattern, str++, FALSE)))) + /*loop*/; + if (ret_code) { + while (*str != '\0') + str++; + while (*pattern != '\0') + pattern++; + } + break; + case '[': + pattern++; + repeat: + if ((*pattern == '\0') || (*pattern == ']')) { + done = TRUE; + break; + } + if (*pattern == '\\') { + pattern++; + if (*pattern == '\0') { + done = TRUE; + break; } - while (*pattern == '*') - pattern++; - return ((*str == '\0') && (*pattern == '\0')); -}; - -#endif - -#if defined(__WIN95__) && defined(__WXDEBUG__) && wxUSE_DBWIN32 - -/* -When I started programming with Visual C++ v4.0, I missed one of my favorite -tools -- DBWIN. Finding the code for a simple debug trace utility, DBMON, -on MSDN was a step in the right direction, but it is a console application -and thus has limited features and extensibility. DBWIN32 is my creation -to solve this problem. - -The code is essentially a merging of a stripped down version of the DBWIN code -from VC 1.5 and DBMON.C with a few 32 bit changes. - -As of version 1.2B, DBWIN32 supports both Win95 and NT. The NT support is -built into the operating system and works just by running DBWIN32. The Win95 -team decided not to support this hook, so I have provided code that will do -this for you. See the file WIN95.TXT for instructions on installing this. - -If you have questions, problems or suggestions about DBWIN32, I welcome your -feedback and plan to actively maintain the code. - -Andrew Tucker -ast@halcyon.com - -To download dbwin32, see e.g.: - -http://ftp.digital.com/pub/micro/NT/WinSite/programr/dbwin32.zip -*/ - -#if !defined(__MWERKS__) && !defined(__SALFORDC__) && !defined(__TWIN32__) -#include -#endif - -void OutputDebugStringW95(const char* lpOutputString, ...) -{ - HANDLE heventDBWIN; /* DBWIN32 synchronization object */ - HANDLE heventData; /* data passing synch object */ - HANDLE hSharedFile; /* memory mapped file shared data */ - LPSTR lpszSharedMem; - char achBuffer[500]; - - /* create the output buffer */ - va_list args; - va_start(args, lpOutputString); - vsprintf(achBuffer, lpOutputString, args); - va_end(args); - - /* - Do a regular OutputDebugString so that the output is - still seen in the debugger window if it exists. - - This ifdef is necessary to avoid infinite recursion - from the inclusion of W95TRACE.H - */ -#ifdef _UNICODE - ::OutputDebugStringW(achBuffer); -#else -#ifdef __TWIN32__ - ::OutputDebugString(achBuffer); -#else - ::OutputDebugStringA(achBuffer); -#endif -#endif - - /* bail if it's not Win95 */ - { - OSVERSIONINFO VerInfo; - VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&VerInfo); - if ( VerInfo.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS ) - return; + } + if (*(pattern + 1) == '-') { + c = *pattern; + pattern += 2; + if (*pattern == ']') { + done = TRUE; + break; } - - /* make sure DBWIN is open and waiting */ - heventDBWIN = OpenEvent(EVENT_MODIFY_STATE, FALSE, "DBWIN_BUFFER_READY"); - if ( !heventDBWIN ) - { - //MessageBox(NULL, "DBWIN_BUFFER_READY nonexistent", NULL, MB_OK); - return; + if (*pattern == '\\') { + pattern++; + if (*pattern == '\0') { + done = TRUE; + break; + } } - - /* get a handle to the data synch object */ - heventData = OpenEvent(EVENT_MODIFY_STATE, FALSE, "DBWIN_DATA_READY"); - if ( !heventData ) - { - // MessageBox(NULL, "DBWIN_DATA_READY nonexistent", NULL, MB_OK); - CloseHandle(heventDBWIN); - return; + if ((*str < c) || (*str > *pattern)) { + pattern++; + goto repeat; } - - hSharedFile = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, 4096, "DBWIN_BUFFER"); - if (!hSharedFile) - { - //MessageBox(NULL, "DebugTrace: Unable to create file mapping object DBWIN_BUFFER", "Error", MB_OK); - CloseHandle(heventDBWIN); - CloseHandle(heventData); - return; + } else if (*pattern != *str) { + pattern++; + goto repeat; + } + pattern++; + while ((*pattern != ']') && (*pattern != '\0')) { + if ((*pattern == '\\') && (*(pattern + 1) != '\0')) + pattern++; + pattern++; + } + if (*pattern != '\0') { + pattern++, str++; + } + break; + case '?': + pattern++; + str++; + break; + case OB: + pattern++; + while ((*pattern != CB) && (*pattern != '\0')) { + cp = str; + ok = TRUE; + while (ok && (*cp != '\0') && (*pattern != '\0') + && (*pattern != ',') && (*pattern != CB)) { + if (*pattern == '\\') + pattern++; + ok = (*pattern++ == *cp++); } - - lpszSharedMem = (LPSTR)MapViewOfFile(hSharedFile, FILE_MAP_WRITE, 0, 0, 512); - if (!lpszSharedMem) - { - //MessageBox(NULL, "DebugTrace: Unable to map shared memory", "Error", MB_OK); - CloseHandle(heventDBWIN); - CloseHandle(heventData); - return; + if (*pattern == '\0') { + ok = FALSE; + done = TRUE; + break; + } else if (ok) { + str = cp; + while ((*pattern != CB) && (*pattern != '\0')) { + if (*++pattern == '\\') { + if (*++pattern == CB) + pattern++; + } + } + } else { + while (*pattern!=CB && *pattern!=',' && *pattern!='\0') { + if (*++pattern == '\\') { + if (*++pattern == CB || *pattern == ',') + pattern++; + } + } } - - /* wait for buffer event */ - WaitForSingleObject(heventDBWIN, INFINITE); - - /* write it to the shared memory */ -#if defined( __BORLANDC__ ) || defined( __MWERKS__ ) || defined(__SALFORDC__) - *((LPDWORD)lpszSharedMem) = getpid(); -#else - *((LPDWORD)lpszSharedMem) = _getpid(); -#endif - - wsprintf(lpszSharedMem + sizeof(DWORD), "%s", achBuffer); - - /* signal data ready event */ - SetEvent(heventData); - - /* clean up handles */ - CloseHandle(hSharedFile); - CloseHandle(heventData); - CloseHandle(heventDBWIN); - - return; -} - + if (*pattern != '\0') + pattern++; + } + break; + default: + if (*str == *pattern) { + str++, pattern++; + } else { + done = TRUE; + } + } + } + while (*pattern == '*') + pattern++; + return ((*str == '\0') && (*pattern == '\0')); +}; #endif - -#ifdef wxUSE_VC_CRTDBG +#if 0 // maximum mumber of lines the output console should have static const WORD MAX_CONSOLE_LINES = 500; BOOL WINAPI MyConsoleHandler( DWORD dwCtrlType ) { // control signal type - FreeConsole(); - return TRUE; + FreeConsole(); + return TRUE; } void wxRedirectIOToConsole() @@ -1110,10 +1085,10 @@ void wxRedirectIOToConsole() AllocConsole(); // set the screen buffer to be big enough to let us scroll text - GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); coninfo.dwSize.Y = MAX_CONSOLE_LINES; - SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); // redirect unbuffered STDOUT to the console @@ -1139,13 +1114,12 @@ void wxRedirectIOToConsole() fp = _fdopen( hConHandle, "w" ); *stderr = *fp; setvbuf( stderr, NULL, _IONBF, 0 ); - - // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog + + // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog // point to console as well ios::sync_with_stdio(); - SetConsoleCtrlHandler(MyConsoleHandler, TRUE); - + SetConsoleCtrlHandler(MyConsoleHandler, TRUE); } #else // Not supported