X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7e86b10b7bced8fd5640e6db75e3232a65146496..7198c3368055d88249a338eb33b21f051f674806:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 4457a14ebe..6e9a224e9d 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -52,6 +52,7 @@ #include "wx/uri.h" #include "wx/mimetype.h" #include "wx/config.h" +#include "wx/versioninfo.h" #if defined(__WXWINCE__) && wxUSE_DATETIME #include "wx/datetime.h" @@ -110,24 +111,15 @@ // ============================================================================ // Array used in DecToHex conversion routine. -static wxChar hexArray[] = wxT("0123456789ABCDEF"); +static const wxChar hexArray[] = wxT("0123456789ABCDEF"); // Convert 2-digit hex number to decimal -int wxHexToDec(const wxString& buf) +int wxHexToDec(const wxString& str) { - int firstDigit, secondDigit; - - if (buf.GetChar(0) >= wxT('A')) - firstDigit = buf.GetChar(0) - wxT('A') + 10; - else - firstDigit = buf.GetChar(0) - wxT('0'); - - if (buf.GetChar(1) >= wxT('A')) - secondDigit = buf.GetChar(1) - wxT('A') + 10; - else - secondDigit = buf.GetChar(1) - wxT('0'); - - return (firstDigit & 0xF) * 16 + (secondDigit & 0xF ); + char buf[2]; + buf[0] = str.GetChar(0); + buf[1] = str.GetChar(1); + return wxHexToDec((const char*) buf); } // Convert decimal integer to 2-character hex string @@ -161,16 +153,6 @@ wxString wxDecToHex(int dec) // misc functions // ---------------------------------------------------------------------------- -// Don't synthesize KeyUp events holding down a key and producing KeyDown -// events with autorepeat. On by default and always 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 // !wxGTK - // Return the current date/time wxString wxNow() { @@ -182,7 +164,7 @@ wxString wxNow() return wxEmptyString; #endif #else - time_t now = time((time_t *) NULL); + time_t now = time(NULL); char *date = ctime(&now); date[24] = '\0'; return wxString::FromAscii(date); @@ -365,8 +347,7 @@ void wxPlatform::AddPlatform(int platform) void wxPlatform::ClearPlatforms() { - delete sm_customPlatforms; - sm_customPlatforms = NULL; + wxDELETE(sm_customPlatforms); } /// Function for testing current platform @@ -545,7 +526,7 @@ wxString wxGetCurrentDir() { if ( errno != ERANGE ) { - wxLogSysError(_T("Failed to get current directory")); + wxLogSysError(wxT("Failed to get current directory")); return wxEmptyString; } @@ -563,6 +544,70 @@ wxString wxGetCurrentDir() #endif // 0 +// ---------------------------------------------------------------------------- +// Environment +// ---------------------------------------------------------------------------- + +#ifdef __WXOSX__ +#if wxOSX_USE_COCOA_OR_CARBON + #include +#endif +#endif + +bool wxGetEnvMap(wxEnvVariableHashMap *map) +{ + wxCHECK_MSG( map, false, wxS("output pointer can't be NULL") ); + +#if defined(__VISUALC__) + wxChar **env = _tenviron; +#elif defined(__VMS) + // Now this routine wil give false for OpenVMS + // TODO : should we do something with logicals? + char **env=NULL; +#elif defined(__WXOSX__) +#if wxOSX_USE_COCOA_OR_CARBON + // Under Mac shared libraries don't have access to the global environ + // variable so use this Mac-specific function instead as advised by + // environ(7) under Darwin + char ***penv = _NSGetEnviron(); + if ( !penv ) + return false; + char **env = *penv; +#else + char **env=NULL; + // todo translate NSProcessInfo environment into map +#endif +#else // non-MSVC non-Mac + // Not sure if other compilers have _tenviron so use the (more standard) + // ANSI version only for them. +#ifdef __BSD__ + // POSIX, but not in an include file + extern char **environ; +#endif + char **env = environ; +#endif + + if ( env ) + { + wxString name, + value; + while ( *env ) + { + const wxString var(*env); + + name = var.BeforeFirst(wxS('='), &value); + + (*map)[name] = value; + + env++; + } + + return true; + } + + return false; +} + // ---------------------------------------------------------------------------- // wxExecute // ---------------------------------------------------------------------------- @@ -573,7 +618,7 @@ wxString wxGetCurrentDir() #if wxUSE_STREAMS static bool ReadAll(wxInputStream *is, wxArrayString& output) { - wxCHECK_MSG( is, false, _T("NULL stream in wxExecute()?") ); + wxCHECK_MSG( is, false, wxT("NULL stream in wxExecute()?") ); // the stream could be already at EOF or in wxSTREAM_BROKEN_PIPE state is->Reset(); @@ -610,13 +655,14 @@ static bool ReadAll(wxInputStream *is, wxArrayString& output) static long wxDoExecuteWithCapture(const wxString& command, wxArrayString& output, wxArrayString* error, - int flags) + int flags, + const wxExecuteEnv *env) { // create a wxProcess which will capture the output wxProcess *process = new wxProcess; process->Redirect(); - long rc = wxExecute(command, wxEXEC_SYNC | flags, process); + long rc = wxExecute(command, wxEXEC_SYNC | flags, process, env); #if wxUSE_STREAMS if ( rc != -1 ) @@ -641,17 +687,19 @@ static long wxDoExecuteWithCapture(const wxString& command, return rc; } -long wxExecute(const wxString& command, wxArrayString& output, int flags) +long wxExecute(const wxString& command, wxArrayString& output, int flags, + const wxExecuteEnv *env) { - return wxDoExecuteWithCapture(command, output, NULL, flags); + return wxDoExecuteWithCapture(command, output, NULL, flags, env); } long wxExecute(const wxString& command, wxArrayString& output, wxArrayString& error, - int flags) + int flags, + const wxExecuteEnv *env) { - return wxDoExecuteWithCapture(command, output, &error, flags); + return wxDoExecuteWithCapture(command, output, &error, flags, env); } // ---------------------------------------------------------------------------- @@ -933,6 +981,16 @@ void wxQsort(void *const pbase, size_t total_elems, #if wxUSE_GUI +// this function is only really implemented for X11-based ports, including GTK1 +// (GTK2 sets detectable auto-repeat automatically anyhow) +#if !(defined(__WXX11__) || defined(__WXMOTIF__) || \ + (defined(__WXGTK__) && !defined(__WXGTK20__))) +bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) ) +{ + return true; +} +#endif // !X11-based port + // ---------------------------------------------------------------------------- // Launch default browser // ---------------------------------------------------------------------------- @@ -943,7 +1001,7 @@ void wxQsort(void *const pbase, size_t total_elems, bool wxDoLaunchDefaultBrowser(const wxString& url, const wxString& scheme, int flags); #elif defined(__WXX11__) || defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXCOCOA__) || \ - (defined(__WXMAC__) && !defined(__WXOSX_IPHONE__)) + (defined(__WXOSX__) ) // implemented in a port-specific utils source file: bool wxDoLaunchDefaultBrowser(const wxString& url, int flags); @@ -959,7 +1017,7 @@ bool wxDoLaunchDefaultBrowser(const wxString& url, int flags) wxString cmd; #if wxUSE_MIMETYPE - wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("html")); + wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(wxT("html")); if ( ft ) { wxString mt; @@ -974,7 +1032,7 @@ bool wxDoLaunchDefaultBrowser(const wxString& url, int flags) { // fallback to checking for the BROWSER environment variable if ( !wxGetEnv(wxT("BROWSER"), &cmd) || cmd.empty() ) - cmd << _T(' ') << url; + cmd << wxT(' ') << url; } ok = ( !cmd.empty() && wxExecute(cmd) ); @@ -1001,8 +1059,7 @@ static bool DoLaunchDefaultBrowserHelper(const wxString& urlOrig, int flags) // this check is useful to avoid that wxURI recognizes as scheme parts of // the filename, in case urlOrig is a local filename // (e.g. "C:\\test.txt" when parsed by wxURI reports a scheme == "C") - bool hasValidScheme = uri.HasScheme() && - (uri.GetScheme() == "http" || uri.GetScheme() == "file"); + bool hasValidScheme = uri.HasScheme() && uri.GetScheme().length() > 1; #if defined(__WXMSW__) @@ -1011,10 +1068,14 @@ static bool DoLaunchDefaultBrowserHelper(const wxString& urlOrig, int flags) // // for (int i=0; i<2; i++) // { + // // test arguments without a valid URL scheme: // wxLaunchDefaultBrowser("C:\\test.txt", i==0 ? 0 : wxBROWSER_NEW_WINDOW); // wxLaunchDefaultBrowser("wxwidgets.org", i==0 ? 0 : wxBROWSER_NEW_WINDOW); + // + // // test arguments with different valid schemes: // wxLaunchDefaultBrowser("file:/C%3A/test.txt", i==0 ? 0 : wxBROWSER_NEW_WINDOW); // wxLaunchDefaultBrowser("http://wxwidgets.org", i==0 ? 0 : wxBROWSER_NEW_WINDOW); + // wxLaunchDefaultBrowser("mailto:user@host.org", i==0 ? 0 : wxBROWSER_NEW_WINDOW); // } // (assuming you have a C:\test.txt file) @@ -1037,9 +1098,13 @@ static bool DoLaunchDefaultBrowserHelper(const wxString& urlOrig, int flags) if ( uri.GetScheme() == "file" ) { - // ShellExecuteEx() doesn't like the "file" scheme when opening local files; + // TODO: extract URLToFileName() to some always compiled in + // function +#if wxUSE_FILESYSTEM + // ShellExecuteEx() doesn't like the "file" scheme when opening local files; // remove it url = wxFileSystem::URLToFileName(url).GetFullPath(); +#endif // wxUSE_FILESYSTEM } } @@ -1109,7 +1174,7 @@ wxChar *wxStripMenuCodes(const wxChar *in, wxChar *out) wxString wxStripMenuCodes(const wxString& in, int flags) { - wxASSERT_MSG( flags, _T("this is useless to call without any flags") ); + wxASSERT_MSG( flags, wxT("this is useless to call without any flags") ); wxString out; @@ -1119,14 +1184,14 @@ wxString wxStripMenuCodes(const wxString& in, int flags) for ( size_t n = 0; n < len; n++ ) { wxChar ch = in[n]; - if ( (flags & wxStrip_Mnemonics) && ch == _T('&') ) + if ( (flags & wxStrip_Mnemonics) && ch == wxT('&') ) { // skip it, it is used to introduce the accel char (or to quote // itself in which case it should still be skipped): note that it // can't be the last character of the string if ( ++n == len ) { - wxLogDebug(_T("Invalid menu string '%s'"), in.c_str()); + wxLogDebug(wxT("Invalid menu string '%s'"), in.c_str()); } else { @@ -1134,7 +1199,7 @@ wxString wxStripMenuCodes(const wxString& in, int flags) ch = in[n]; } } - else if ( (flags & wxStrip_Accel) && ch == _T('\t') ) + else if ( (flags & wxStrip_Accel) && ch == wxT('\t') ) { // everything after TAB is accel string, exit the loop break; @@ -1276,14 +1341,14 @@ wxWindow* wxGenericFindWindowAtPoint(const wxPoint& pt) int wxMessageBox(const wxString& message, const wxString& caption, long style, wxWindow *parent, int WXUNUSED(x), int WXUNUSED(y) ) { - long decorated_style = style; - - if ( ( style & ( wxICON_EXCLAMATION | wxICON_HAND | wxICON_INFORMATION | wxICON_QUESTION ) ) == 0 ) + // add the appropriate icon unless this was explicitly disabled by use of + // wxICON_NONE + if ( !(style & wxICON_NONE) && !(style & wxICON_MASK) ) { - decorated_style |= ( style & wxYES ) ? wxICON_QUESTION : wxICON_INFORMATION ; + style |= style & wxYES ? wxICON_QUESTION : wxICON_INFORMATION; } - wxMessageDialog dialog(parent, message, caption, decorated_style); + wxMessageDialog dialog(parent, message, caption, style); int ans = dialog.ShowModal(); switch ( ans ) @@ -1298,47 +1363,60 @@ int wxMessageBox(const wxString& message, const wxString& caption, long style, return wxCANCEL; } - wxFAIL_MSG( _T("unexpected return code from wxMessageDialog") ); + wxFAIL_MSG( wxT("unexpected return code from wxMessageDialog") ); return wxCANCEL; } -void wxInfoMessageBox(wxWindow* parent) +wxVersionInfo wxGetLibraryVersionInfo() { // don't translate these strings, they're for diagnostics purposes only wxString msg; - msg.Printf(_T("wxWidgets Library (%s port)\n") - _T("Version %d.%d.%d%s%s, compiled at %s %s\n") - _T("Runtime version of toolkit used is %d.%d.%s\n") - _T("Copyright (c) 1995-2009 wxWidgets team"), - wxPlatformInfo::Get().GetPortIdName().c_str(), + msg.Printf(wxS("wxWidgets Library (%s port)\n") + wxS("Version %d.%d.%d (Unicode: %s, debug level: %d),\n") + wxS("compiled at %s %s\n\n") + wxS("Runtime version of toolkit used is %d.%d.\n"), + wxPlatformInfo::Get().GetPortIdName(), wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER, -#if wxUSE_UNICODE - L" (Unicode)", +#if wxUSE_UNICODE_UTF8 + "UTF-8", +#elif wxUSE_UNICODE + "wchar_t", #else - wxEmptyString, -#endif -#ifdef __WXDEBUG__ - _T(" Debug build"), -#else - wxEmptyString, + "none", #endif + wxDEBUG_LEVEL, __TDATE__, __TTIME__, wxPlatformInfo::Get().GetToolkitMajorVersion(), - wxPlatformInfo::Get().GetToolkitMinorVersion(), + wxPlatformInfo::Get().GetToolkitMinorVersion() + ); + #ifdef __WXGTK__ - wxString::Format("\nThe compile-time GTK+ version is %d.%d.%d.", - GTK_MAJOR_VERSION, - GTK_MINOR_VERSION, - GTK_MICRO_VERSION).c_str() -#else - wxEmptyString -#endif - ); - wxMessageBox(msg, _T("wxWidgets information"), + msg += wxString::Format("Compile-time GTK+ version is %d.%d.%d.\n", + GTK_MAJOR_VERSION, + GTK_MINOR_VERSION, + GTK_MICRO_VERSION); +#endif // __WXGTK__ + + return wxVersionInfo(wxS("wxWidgets"), + wxMAJOR_VERSION, + wxMINOR_VERSION, + wxRELEASE_NUMBER, + msg, + wxS("Copyright (c) 1995-2010 wxWidgets team")); +} + +void wxInfoMessageBox(wxWindow* parent) +{ + wxVersionInfo info = wxGetLibraryVersionInfo(); + wxString msg = info.ToString(); + + msg << wxS("\n") << info.GetCopyright(); + + wxMessageBox(msg, wxT("wxWidgets information"), wxICON_INFORMATION | wxOK, parent); } @@ -1458,7 +1536,7 @@ wxColour wxGetColourFromUser(wxWindow *parent, wxFont wxGetFontFromUser(wxWindow *parent, const wxFont& fontInit, const wxString& caption) { wxFontData data; - if ( fontInit.Ok() ) + if ( fontInit.IsOk() ) { data.SetInitialFont(fontInit); } @@ -1489,6 +1567,12 @@ void wxEnableTopLevelWindows(bool enable) node->GetData()->Enable(enable); } +#if defined(__WXOSX__) && wxOSX_USE_COCOA + +// defined in evtloop.mm + +#else + wxWindowDisabler::wxWindowDisabler(bool disable) { m_disabled = disable; @@ -1551,6 +1635,8 @@ wxWindowDisabler::~wxWindowDisabler() delete m_winDisabled; } +#endif + // Yield to other apps/messages and disable user input to all windows except // the given one bool wxSafeYield(wxWindow *win, bool onlyIfNeeded)