X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/17dff81c7141e142765b168ab225e5c61475669f..917b3d40f2da1f02a81cbe385118a504072c401c:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index f516c32e43..1dffad113c 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -6,7 +6,7 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Julian Smart -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -30,15 +30,12 @@ #include "wx/textdlg.h" #endif +#include "wx/ioswrap.h" + #if wxUSE_IOSTREAMH -#include -#include + #include #else -#include -#include -# ifdef _MSC_VER - using namespace std; -# endif + #include #endif #include @@ -46,9 +43,9 @@ #include #include #if !defined(__WATCOMC__) -#if !(defined(_MSC_VER) && (_MSC_VER > 800)) -#include -#endif + #if !(defined(_MSC_VER) && (_MSC_VER > 800)) + #include + #endif #endif #include #ifndef __MWERKS__ @@ -56,6 +53,10 @@ #include #endif +#ifdef __SALFORDC__ +#include +#endif + // Pattern matching code. // Yes, this path is deliberate (for Borland compilation) #ifdef wx_mac /* MATTHEW: [5] Mac doesn't like paths with "/" */ @@ -70,7 +71,14 @@ #define _MAXPATHLEN 500 -extern char *wxBuffer; +extern wxChar *wxBuffer; + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static wxWindow *wxFindWindowByLabel1(const wxString& title, wxWindow * parent); +static wxWindow *wxFindWindowByName1 (const wxString& title, wxWindow * parent); #ifdef __WXMAC__ int strcasecmp(const char *str_1, const char *str_2) @@ -88,14 +96,14 @@ int strncasecmp(const char *str_1, const char *str_2, size_t maxchar) { register char c1, c2; - while( maxchar--) + while( maxchar--) { c1 = tolower(*str_1++); c2 = tolower(*str_2++); - + if ( !c1 || c1!=c2 ) - return c1 - c2; - + return c1 - c2; + } ; return 0 ; @@ -159,15 +167,13 @@ int strncasecmp(const char *str_1, const char *str_2, size_t maxchar) #endif #endif -#ifdef _MSC_VER -#pragma warning (disable : 4245) -#endif +#else -#ifdef _MSC_VER -#pragma warning (default : 4245) +#ifdef __EMX__ +#define strcasecmp stricmp +#define strncasecmp strnicmp #endif -#else // This declaration is missing in SunOS! // (Yes, I know it is NOT ANSI-C but its in BSD libc) #if defined(__xlC) || defined(__AIX__) || defined(__GNUG__) @@ -177,17 +183,17 @@ extern "C" int strncasecmp (const char *, const char *, size_t); } #endif -#endif /* __WXMSW__ */ +#endif /* __WXMSW__ */ -char * -copystring (const char *s) +wxChar * +copystring (const wxChar *s) { - if (s == NULL) s = ""; - size_t len = strlen (s) + 1; + if (s == NULL) s = _T(""); + size_t len = wxStrlen (s) + 1; - char *news = new char[len]; - memcpy (news, s, len); // Should be the fastest + wxChar *news = new wxChar[len]; + memcpy (news, s, len * sizeof(wxChar)); // Should be the fastest return news; } @@ -195,7 +201,7 @@ copystring (const char *s) // Id generation static long wxCurrentId = 100; -long +long wxNewId (void) { return wxCurrentId++; @@ -204,102 +210,101 @@ wxNewId (void) long wxGetCurrentId(void) { return wxCurrentId; } -void +void wxRegisterId (long id) { if (id >= wxCurrentId) wxCurrentId = id + 1; } -void -StringToFloat (char *s, float *number) +void +StringToFloat (wxChar *s, float *number) { if (s && *s && number) - *number = (float) strtod (s, (char **) NULL); + *number = (float) wxStrtod (s, (wxChar **) NULL); } -void -StringToDouble (char *s, double *number) +void +StringToDouble (wxChar *s, double *number) { if (s && *s && number) - *number = strtod (s, (char **) NULL); + *number = wxStrtod (s, (wxChar **) NULL); } -char * -FloatToString (float number, const char *fmt) +wxChar * +FloatToString (float number, const wxChar *fmt) { - static char buf[256]; + static wxChar buf[256]; // sprintf (buf, "%.2f", number); - sprintf (buf, fmt, number); + wxSprintf (buf, fmt, number); return buf; } -char * -DoubleToString (double number, const char *fmt) +wxChar * +DoubleToString (double number, const wxChar *fmt) { - static char buf[256]; + static wxChar buf[256]; - sprintf (buf, fmt, number); + wxSprintf (buf, fmt, number); return buf; } -void -StringToInt (char *s, int *number) +void +StringToInt (wxChar *s, int *number) { if (s && *s && number) - *number = (int) strtol (s, (char **) NULL, 10); + *number = (int) wxStrtol (s, (wxChar **) NULL, 10); } -void -StringToLong (char *s, long *number) +void +StringToLong (wxChar *s, long *number) { if (s && *s && number) - *number = strtol (s, (char **) NULL, 10); + *number = wxStrtol (s, (wxChar **) NULL, 10); } -char * +wxChar * IntToString (int number) { - static char buf[20]; + static wxChar buf[20]; - sprintf (buf, "%d", number); + wxSprintf (buf, _T("%d"), number); return buf; } -char * +wxChar * LongToString (long number) { - static char buf[20]; + static wxChar buf[20]; - sprintf (buf, "%ld", number); + wxSprintf (buf, _T("%ld"), number); return buf; } // Array used in DecToHex conversion routine. -static char hexArray[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', - 'C', 'D', 'E', 'F' }; +static wxChar hexArray[] = _T("0123456789ABCDEF"); // Convert 2-digit hex number to decimal int wxHexToDec(const wxString& buf) { int firstDigit, secondDigit; - - if (buf.GetChar(0) >= 'A') - firstDigit = buf.GetChar(0) - 'A' + 10; + + if (buf.GetChar(0) >= _T('A')) + firstDigit = buf.GetChar(0) - _T('A') + 10; else - firstDigit = buf.GetChar(0) - '0'; + firstDigit = buf.GetChar(0) - _T('0'); - if (buf.GetChar(1) >= 'A') - secondDigit = buf.GetChar(1) - 'A' + 10; + if (buf.GetChar(1) >= _T('A')) + secondDigit = buf.GetChar(1) - _T('A') + 10; else - secondDigit = buf.GetChar(1) - '0'; - + secondDigit = buf.GetChar(1) - _T('0'); + return firstDigit * 16 + secondDigit; } // Convert decimal integer to 2-character hex string -void wxDecToHex(int dec, char *buf) +void wxDecToHex(int dec, wxChar *buf) { int firstDigit = (int)(dec/16.0); int secondDigit = (int)(dec - (firstDigit*16.0)); @@ -311,13 +316,13 @@ void wxDecToHex(int dec, char *buf) // Convert decimal integer to 2-character hex string wxString wxDecToHex(int dec) { - char buf[3]; + wxChar buf[3]; wxDecToHex(dec, buf); return wxString(buf); } // Match a string INDEPENDENT OF CASE -bool +bool StringMatch (char *str1, char *str2, bool subString, bool exact) { if (str1 == NULL || str2 == NULL) @@ -334,15 +339,15 @@ StringMatch (char *str1, char *str2, bool subString, bool exact) // Search for str1 in str2 // Slow .... but acceptable for short strings for (i = 0; i <= len2 - len1; i++) - { - if (strncasecmp (str1, str2 + i, len1) == 0) - return TRUE; - } + { + if (strncasecmp (str1, str2 + i, len1) == 0) + return TRUE; + } } else if (exact) { if (strcasecmp (str1, str2) == 0) - return TRUE; + return TRUE; } else { @@ -350,87 +355,75 @@ StringMatch (char *str1, char *str2, bool subString, bool exact) int len2 = strlen (str2); if (strncasecmp (str1, str2, wxMin (len1, len2)) == 0) - return TRUE; + return TRUE; } return FALSE; } +// Don't synthesize KeyUp events holding down a key and producing +// KeyDown events with autorepeat. On by default and always on +// on in wxMSW. wxGTK version in utilsgtk.cpp. +#ifndef __WXGTK__ +bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) ) +{ + return TRUE; // detectable auto-repeat is the only mode MSW supports +} +#endif + // Return the current date/time // [volatile] wxString wxNow( void ) { time_t now = time((time_t *) NULL); - char *date = ctime(&now); + char *date = ctime(&now); date[24] = '\0'; return wxString(date); } -/* Get Full RFC822 style email address */ -bool -wxGetEmailAddress (char *address, int maxSize) -{ - char host[65]; - char user[65]; - - if (wxGetHostName(host, 64) == FALSE) - return FALSE; - if (wxGetUserId(user, 64) == FALSE) - return FALSE; - - char tmp[130]; - strcpy(tmp, user); - strcat(tmp, "@"); - strcat(tmp, host); - - strncpy(address, tmp, maxSize - 1); - address[maxSize-1] = '\0'; - return TRUE; -} - /* * Strip out any menu codes */ -char *wxStripMenuCodes (char *in, char *out) +wxChar *wxStripMenuCodes (wxChar *in, wxChar *out) { if (!in) - return (char *) NULL; - + return (wxChar *) NULL; + if (!out) out = copystring(in); - char *tmpOut = out; - + wxChar *tmpOut = out; + while (*in) { - if (*in == '&') - { - // Check && -> &, &x -> x - if (*++in == '&') - *out++ = *in++; - } - else if (*in == '\t') - { + if (*in == _T('&')) + { + // Check && -> &, &x -> x + if (*++in == _T('&')) + *out++ = *in++; + } + else if (*in == _T('\t')) + { // Remove all stuff after \t in X mode, and let the stuff as is // in Windows mode. // Accelerators are handled in wx_item.cc for Motif, and are not // YET supported in XView - break; - } + break; + } else - *out++ = *in++; - } // while + *out++ = *in++; + } // while - *out = '\0'; + *out = _T('\0'); return tmpOut; } wxString wxStripMenuCodes(const wxString& str) { - char *buf = new char[str.Length() + 1]; - wxStripMenuCodes((char*) (const char*) str, buf); + wxChar *buf = new wxChar[str.Length() + 1]; + wxStripMenuCodes(WXSTRINGCAST str, buf); wxString str1(buf); delete[] buf; return str1; @@ -447,53 +440,54 @@ wxString wxStripMenuCodes(const wxString& str) * */ -static wxWindow *wxFindWindowByLabel1 (const wxString& title, wxWindow * parent); - wxWindow * wxFindWindowByLabel (const wxString& title, wxWindow * parent) { - if (parent) + if (parent) { - return wxFindWindowByLabel1 (title, parent); + return wxFindWindowByLabel1(title, parent); } - else + else { - for (wxNode * node = wxTopLevelWindows.First (); node; node = node->Next ()) - { - wxWindow *win = (wxWindow *) node->Data (); - wxWindow *retwin = wxFindWindowByLabel1 (title, win); - if (retwin) - return retwin; - } // for() + for ( wxWindowList::Node * node = wxTopLevelWindows.GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = node->GetData(); + wxWindow *retwin = wxFindWindowByLabel1 (title, win); + if (retwin) + return retwin; + } // for() } - return (wxWindow *) NULL; + return (wxWindow *) NULL; } // Recursive static wxWindow * wxFindWindowByLabel1 (const wxString& title, wxWindow * parent) { - if (parent) + if (parent) { - if (parent->GetLabel() == title) - return parent; + if (parent->GetLabel() == title) + return parent; } - if (parent) + if (parent) { - for (wxNode * node = parent->GetChildren().First (); node; node = node->Next ()) - { - wxWindow *win = (wxWindow *) node->Data (); - wxWindow *retwin = wxFindWindowByLabel1 (title, win); - if (retwin) - return retwin; - } // for() + for ( wxWindowList::Node * node = parent->GetChildren().GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = (wxWindow *)node->GetData(); + wxWindow *retwin = wxFindWindowByLabel1 (title, win); + if (retwin) + return retwin; + } } - return (wxWindow *) NULL; // Not found - + return (wxWindow *) NULL; // Not found } /* @@ -502,28 +496,29 @@ wxFindWindowByLabel1 (const wxString& title, wxWindow * parent) * */ -static wxWindow *wxFindWindowByName1 (const wxString& title, wxWindow * parent); - wxWindow * wxFindWindowByName (const wxString& title, wxWindow * parent) { - if (parent) + if (parent) { - return wxFindWindowByName1 (title, parent); + return wxFindWindowByName1 (title, parent); } - else + else { - for (wxNode * node = wxTopLevelWindows.First (); node; node = node->Next ()) - { - wxWindow *win = (wxWindow *) node->Data (); - wxWindow *retwin = wxFindWindowByName1 (title, win); - if (retwin) - return retwin; - } // for() + for ( wxWindowList::Node * node = wxTopLevelWindows.GetFirst(); + node; + node = node->GetNext() ) + { + wxWindow *win = node->GetData(); + wxWindow *retwin = wxFindWindowByName1 (title, win); + if (retwin) + return retwin; + } } - // Failed? Try by label instead. - return wxFindWindowByLabel(title, parent); + + // Failed? Try by label instead. + return wxFindWindowByLabel(title, parent); } // Recursive @@ -532,28 +527,28 @@ wxFindWindowByName1 (const wxString& title, wxWindow * parent) { if (parent) { - if ( parent->GetName() == title ) - return parent; + if ( parent->GetName() == title ) + return parent; } if (parent) { for (wxNode * node = parent->GetChildren().First (); node; node = node->Next ()) - { - wxWindow *win = (wxWindow *) node->Data (); - wxWindow *retwin = wxFindWindowByName1 (title, win); - if (retwin) - return retwin; - } // for() + { + wxWindow *win = (wxWindow *) node->Data (); + wxWindow *retwin = wxFindWindowByName1 (title, win); + if (retwin) + return retwin; + } // for() } - return (wxWindow *) NULL; // Not found + return (wxWindow *) NULL; // Not found } // Returns menu item id or -1 if none. -int +int wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& itemString) { wxMenuBar *menuBar = frame->GetMenuBar (); @@ -562,66 +557,18 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i return menuBar->FindMenuItem (menuString, itemString); } -/* - * wxDebugStreamBuf - */ -#if !defined(_WINDLL) - -wxDebugStreamBuf::wxDebugStreamBuf(void) -{ - // usage doesn't need this, and i have no idea how to simulate it. -#if wxUSE_IOSTREAMH - if (allocate()) - setp(base(),ebuf()); -#endif -} - -int wxDebugStreamBuf::overflow(int WXUNUSED(i)) -{ - int len = pptr() - pbase(); - char *txt = new char[len+1]; - strncpy(txt, pbase(), len); - txt[len] = '\0'; -#ifdef __WXMSW__ - OutputDebugString((LPCSTR)txt); -#else - fprintf(stderr, txt); -#endif - setp(pbase(), epptr()); - delete[] txt; - return EOF; -} - -int wxDebugStreamBuf::sync(void) -{ - int len = pptr() - pbase(); - char *txt = new char[len+1]; - strncpy(txt, pbase(), len); - txt[len] = '\0'; -#ifdef __WXMSW__ - OutputDebugString((LPCSTR)txt); -#else - fprintf(stderr, txt); -#endif - setp(pbase(), epptr()); - delete[] txt; - return 0; -} - -#endif - /* On Fri, 21 Jul 1995, Paul Craven wrote: > Is there a way to find the path of running program's executable? I can get > my home directory, and the current directory, but I don't know how to get the > executable directory. -> +> The code below (warty as it is), does what you want on most Unix, DOS, and Mac platforms (it's from the ALS Prolog main). -|| Ken Bowen Applied Logic Systems, Inc. PO Box 180, +|| Ken Bowen Applied Logic Systems, Inc. PO Box 180, ||==== Voice: +1 (617)965-9191 Newton Centre, || FAX: +1 (617)965-1636 MA 02159 USA Email: ken@als.com WWW: http://www.als.com @@ -634,8 +581,8 @@ DOS, and Mac platforms (it's from the ALS Prolog main). /*--------------------------------------------------------------------* | whereami is given a filename f in the form: whereami(argv[0]) - | It returns the directory in which the executable file (containing - | this code [main.c] ) may be found. A dot will be returned to indicate + | It returns the directory in which the executable file (containing + | this code [main.c] ) may be found. A dot will be returned to indicate | the current directory. *--------------------------------------------------------------------*/ @@ -643,7 +590,7 @@ static void whereami(name) char *name; { - register char *cutoff = NULL; /* stifle -Wall */ + register char *cutoff = NULL; /* stifle -Wall */ register char *s; register char *t; int cc; @@ -656,117 +603,117 @@ whereami(name) if (access(name, R_OK) == 0) { - /*-------------------------------------------------------------* - * The file was accessible without any other work. But the current - * working directory might change on us, so if it was accessible - * through the cwd, then we should get it for later accesses. - *-------------------------------------------------------------*/ + /*-------------------------------------------------------------* + * The file was accessible without any other work. But the current + * working directory might change on us, so if it was accessible + * through the cwd, then we should get it for later accesses. + *-------------------------------------------------------------*/ - t = imagedir; - if (!absolute_pathname(name)) { + t = imagedir; + if (!absolute_pathname(name)) { #if defined(DOS) || defined(__WIN32__) - int drive; - char *newrbuf; + int drive; + char *newrbuf; - newrbuf = imagedir; + newrbuf = imagedir; #ifndef __DJGPP__ - if (*(name + 1) == ':') { - if (*name >= 'a' && *name <= 'z') - drive = (int) (*name - 'a' + 1); - else - drive = (int) (*name - 'A' + 1); - *newrbuf++ = *name; - *newrbuf++ = *(name + 1); - *newrbuf++ = DIR_SEPARATOR; - } - else { - drive = 0; - *newrbuf++ = DIR_SEPARATOR; - } - if (getcwd(newrbuf, drive) == 0) { /* } */ + if (*(name + 1) == ':') { + if (*name >= 'a' && *name <= 'z') + drive = (int) (*name - 'a' + 1); + else + drive = (int) (*name - 'A' + 1); + *newrbuf++ = *name; + *newrbuf++ = *(name + 1); + *newrbuf++ = DIR_SEPARATOR; + } + else { + drive = 0; + *newrbuf++ = DIR_SEPARATOR; + } + if (getcwd(newrbuf, drive) == 0) { /* } */ #else - if (getcwd(newrbuf, 1024) == 0) { /* } */ + if (getcwd(newrbuf, 1024) == 0) { /* } */ #endif #else /* DOS */ #ifdef HAVE_GETWD - if (getwd(imagedir) == 0) { /* } */ + if (getwd(imagedir) == 0) { /* } */ #else /* !HAVE_GETWD */ - if (getcwd(imagedir, 1024) == 0) { + if (getcwd(imagedir, 1024) == 0) { #endif /* !HAVE_GETWD */ #endif /* DOS */ - fatal_error(FE_GETCWD, 0); - } - for (; *t; t++) /* Set t to end of buffer */ - ; - if (*(t - 1) == DIR_SEPARATOR) /* leave slash if already - * last char - */ - cutoff = t - 1; - else { - cutoff = t; /* otherwise put one in */ - *t++ = DIR_SEPARATOR; - } - } + fatal_error(FE_GETCWD, 0); + } + for (; *t; t++) /* Set t to end of buffer */ + ; + if (*(t - 1) == DIR_SEPARATOR) /* leave slash if already + * last char + */ + cutoff = t - 1; + else { + cutoff = t; /* otherwise put one in */ + *t++ = DIR_SEPARATOR; + } + } #if (!defined(__MAC__) && !defined(__DJGPP__) && !defined(__GO32__) && !defined(__WIN32__)) - else - (*t++ = DIR_SEPARATOR); + else + (*t++ = DIR_SEPARATOR); #endif - /*-------------------------------------------------------------* - * Copy the rest of the string and set the cutoff if it was not - * already set. If the first character of name is a slash, cutoff - * is not presently set but will be on the first iteration of the - * loop below. - *-------------------------------------------------------------*/ + /*-------------------------------------------------------------* + * Copy the rest of the string and set the cutoff if it was not + * already set. If the first character of name is a slash, cutoff + * is not presently set but will be on the first iteration of the + * loop below. + *-------------------------------------------------------------*/ - for ((*name == DIR_SEPARATOR ? (s = name+1) : (s = name));;) { - if (*s == DIR_SEPARATOR) - cutoff = t; - if (!(*t++ = *s++)) - break; - } + for ((*name == DIR_SEPARATOR ? (s = name+1) : (s = name));;) { + if (*s == DIR_SEPARATOR) + cutoff = t; + if (!(*t++ = *s++)) + break; + } } else { - /*-------------------------------------------------------------* - * Get the path list from the environment. If the path list is - * inaccessible for any reason, leave with fatal error. - *-------------------------------------------------------------*/ + /*-------------------------------------------------------------* + * Get the path list from the environment. If the path list is + * inaccessible for any reason, leave with fatal error. + *-------------------------------------------------------------*/ #ifdef __MAC__ - if ((s = getenv("Commands")) == (char *) 0) + if ((s = getenv("Commands")) == (char *) 0) #else - if ((s = getenv("PATH")) == (char *) 0) + if ((s = getenv("PATH")) == (char *) 0) #endif - fatal_error(FE_PATH, 0); - - /* - * Copy path list into ebuf and set the source pointer to the - * beginning of this buffer. - */ - - strcpy(ebuf, s); - s = ebuf; - - for (;;) { - t = imagedir; - while (*s && *s != PATH_SEPARATOR) - *t++ = *s++; - if (t > imagedir && *(t - 1) == DIR_SEPARATOR) - ; /* do nothing -- slash already is in place */ - else - *t++ = DIR_SEPARATOR; /* put in the slash */ - cutoff = t - 1; /* set cutoff */ - strcpy(t, name); - if (access(imagedir, R_OK) == 0) - break; - - if (*s) - s++; /* advance source pointer */ - else - fatal_error(FE_INFND, 0); - } + fatal_error(FE_PATH, 0); + + /* + * Copy path list into ebuf and set the source pointer to the + * beginning of this buffer. + */ + + strcpy(ebuf, s); + s = ebuf; + + for (;;) { + t = imagedir; + while (*s && *s != PATH_SEPARATOR) + *t++ = *s++; + if (t > imagedir && *(t - 1) == DIR_SEPARATOR) + ; /* do nothing -- slash already is in place */ + else + *t++ = DIR_SEPARATOR; /* put in the slash */ + cutoff = t - 1; /* set cutoff */ + strcpy(t, name); + if (access(imagedir, R_OK) == 0) + break; + + if (*s) + s++; /* advance source pointer */ + else + fatal_error(FE_INFND, 0); + } } @@ -779,29 +726,47 @@ whereami(name) #ifdef HAVE_SYMLINK while ((cc = readlink(imagedir, ebuf, 512)) != -1) { - ebuf[cc] = 0; - s = ebuf; - if (*s == DIR_SEPARATOR) { - t = imagedir; - } - else { - t = cutoff + 1; - } - for (;;) { - if (*s == DIR_SEPARATOR) - cutoff = t; /* mark the last slash seen */ - if (!(*t++ = *s++)) /* copy the character */ - break; - } + ebuf[cc] = 0; + s = ebuf; + if (*s == DIR_SEPARATOR) { + t = imagedir; + } + else { + t = cutoff + 1; + } + for (;;) { + if (*s == DIR_SEPARATOR) + cutoff = t; /* mark the last slash seen */ + if (!(*t++ = *s++)) /* copy the character */ + break; + } } #endif /* HAVE_SYMLINK */ - strcpy(imagename, cutoff + 1); /* keep the image name */ - *(cutoff + 1) = 0; /* chop off the filename part */ + strcpy(imagename, cutoff + 1); /* keep the image name */ + *(cutoff + 1) = 0; /* chop off the filename part */ } #endif +void wxEnableTopLevelWindows(bool enable) +{ + wxWindowList::Node *node; + for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) + node->GetData()->Enable(enable); +} + +// Yield to other apps/messages and disable user input +bool wxSafeYield(wxWindow *win) +{ + wxEnableTopLevelWindows(FALSE); + // always enable ourselves + if ( win ) + win->Enable(TRUE); + bool rc = wxYield(); + wxEnableTopLevelWindows(TRUE); + return rc; +} /* * N.B. these convenience functions must be separate from msgdlgg.cpp, textdlgg.cpp @@ -833,6 +798,7 @@ int wxMessageBox(const wxString& message, const wxString& caption, long style, return ans; } +#if wxUSE_TEXTDLG wxString wxGetTextFromUser(const wxString& message, const wxString& caption, const wxString& defaultValue, wxWindow *parent, int x, int y, bool WXUNUSED(centre) ) @@ -843,15 +809,110 @@ wxString wxGetTextFromUser(const wxString& message, const wxString& caption, else return wxString(""); } +#endif // wxUSE_TEXTDLG #ifdef __MWERKS__ -char *strdup(const char *s) +char *strdup(const char *s) { - return strcpy( (char*) malloc( strlen( s ) + 1 ) , s ) ; + return strcpy( (char*) malloc( strlen( s ) + 1 ) , s ) ; } -int isascii( int c ) +int isascii( int c ) { - return ( c >= 0 && c < 128 ) ; + return ( c >= 0 && c < 128 ) ; } #endif + +// ---------------------------------------------------------------------------- +// network and user id functions +// ---------------------------------------------------------------------------- + +// Get Full RFC822 style email address +bool wxGetEmailAddress(wxChar *address, int maxSize) +{ + wxString email = wxGetEmailAddress(); + if ( !email ) + return FALSE; + + wxStrncpy(address, email, maxSize - 1); + address[maxSize - 1] = _T('\0'); + + return TRUE; +} + +wxString wxGetEmailAddress() +{ + wxString email; + + wxString host = wxGetHostName(); + if ( !!host ) + { + wxString user = wxGetUserId(); + if ( !!user ) + { + wxString email(user); + email << _T('@') << host; + } + } + + return email; +} + +wxString wxGetUserId() +{ + static const int maxLoginLen = 256; // FIXME arbitrary number + + wxString buf; + bool ok = wxGetUserId(buf.GetWriteBuf(maxLoginLen), maxLoginLen); + buf.UngetWriteBuf(); + + if ( !ok ) + buf.Empty(); + + return buf; +} + +wxString wxGetUserName() +{ + static const int maxUserNameLen = 1024; // FIXME arbitrary number + + wxString buf; + bool ok = wxGetUserName(buf.GetWriteBuf(maxUserNameLen), maxUserNameLen); + buf.UngetWriteBuf(); + + if ( !ok ) + buf.Empty(); + + return buf; +} + +wxString wxGetHostName() +{ + static const size_t hostnameSize = 257; + + wxString buf; + bool ok = wxGetHostName(buf.GetWriteBuf(hostnameSize), hostnameSize); + + buf.UngetWriteBuf(); + + if ( !ok ) + buf.Empty(); + + return buf; +} + +wxString wxGetFullHostName() +{ + static const size_t hostnameSize = 257; + + wxString buf; + bool ok = wxGetFullHostName(buf.GetWriteBuf(hostnameSize), hostnameSize); + + buf.UngetWriteBuf(); + + if ( !ok ) + buf.Empty(); + + return buf; +} +