X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2ecd1756e4238edc910a38a18f84b4f5bf42f85c..844cada1622b2923754493a4c8eb91b82232093e:/src/common/utilscmn.cpp?ds=sidebyside diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 2e8c64bfe6..bc45db3b2b 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -84,10 +84,7 @@ #endif // ! __WXPALMOS5__ #ifdef __WXMAC__ -#include "wx/mac/private.h" -#ifndef __DARWIN__ -#include "InternetConfig.h" -#endif +#include "wx/osx/private.h" #endif #ifndef __WXPALMOS5__ @@ -109,10 +106,6 @@ #if wxUSE_BASE -// ---------------------------------------------------------------------------- -// common data -// ---------------------------------------------------------------------------- - // ============================================================================ // implementation // ============================================================================ @@ -128,7 +121,7 @@ int wxHexToDec(const wxString& buf) if (buf.GetChar(0) >= wxT('A')) firstDigit = buf.GetChar(0) - wxT('A') + 10; else - firstDigit = buf.GetChar(0) - wxT('0'); + firstDigit = buf.GetChar(0) - wxT('0'); if (buf.GetChar(1) >= wxT('A')) secondDigit = buf.GetChar(1) - wxT('A') + 10; @@ -169,6 +162,16 @@ 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() { @@ -187,10 +190,12 @@ wxString wxNow() #endif } +#if WXWIN_COMPATIBILITY_2_8 void wxUsleep(unsigned long milliseconds) { wxMilliSleep(milliseconds); } +#endif const wxChar *wxGetInstallPrefix() { @@ -227,6 +232,10 @@ bool wxIsPlatformLittleEndian() } +// ---------------------------------------------------------------------------- +// wxPlatform +// ---------------------------------------------------------------------------- + /* * Class to make it easier to specify platform-dependent values */ @@ -439,8 +448,7 @@ bool wxGetEmailAddress(wxChar *address, int maxSize) if ( !email ) return false; - wxStrncpy(address, email, maxSize - 1); - address[maxSize - 1] = wxT('\0'); + wxStrlcpy(address, email.t_str(), maxSize); return true; } @@ -648,19 +656,9 @@ long wxExecute(const wxString& command, } // ---------------------------------------------------------------------------- -// wxApp::Yield() wrappers for backwards compatibility +// Id functions // ---------------------------------------------------------------------------- -bool wxYield() -{ - return wxTheApp && wxTheApp->Yield(); -} - -bool wxYieldIfNeeded() -{ - return wxTheApp && wxTheApp->Yield(true); -} - // Id generation static long wxCurrentId = 100; @@ -714,16 +712,16 @@ Thanks, /* Byte-wise swap two items of size SIZE. */ #define SWAP(a, b, size) \ - do \ - { \ - register size_t __size = (size); \ - register char *__a = (a), *__b = (b); \ + do \ + { \ + register size_t __size = (size); \ + register char *__a = (a), *__b = (b); \ do \ - { \ - char __tmp = *__a; \ + { \ + char __tmp = *__a; \ *__a++ = *__b; \ - *__b++ = __tmp; \ - } while (--__size > 0); \ + *__b++ = __tmp; \ + } while (--__size > 0); \ } while (0) /* Discontinue quicksort algorithm when partition gets below this size. @@ -926,9 +924,9 @@ void wxQsort(void *const pbase, size_t total_elems, } } +#endif // wxUSE_BASE -#endif // wxUSE_BASE // ============================================================================ // GUI-only functions from now on @@ -936,6 +934,54 @@ void wxQsort(void *const pbase, size_t total_elems, #if wxUSE_GUI +// ---------------------------------------------------------------------------- +// Launch document with default app +// ---------------------------------------------------------------------------- + +bool wxLaunchDefaultApplication(const wxString& document, int flags) +{ + wxUnusedVar(flags); + +#ifdef __WXMAC__ + static const char * const OPEN_CMD = "/usr/bin/open"; + if ( wxFileExists(OPEN_CMD) && + wxExecute(wxString(OPEN_CMD) + " " + document) ) + return true; +#elif defined(__UNIX__) + // Our best best is to use xdg-open from freedesktop.org cross-desktop + // compatibility suite xdg-utils + // (see http://portland.freedesktop.org/wiki/) -- this is installed on + // most modern distributions and may be tweaked by them to handle + // distribution specifics. + wxString path, xdg_open; + if ( wxGetEnv("PATH", &path) && + wxFindFileInPath(&xdg_open, path, "xdg-open") ) + { + if ( wxExecute(xdg_open + " " + document) ) + return true; + } +#elif defined(__WXMSW__) + WinStruct sei; + sei.lpFile = document.wx_str(); + sei.lpVerb = _T("open"); +#ifdef __WXWINCE__ + sei.nShow = SW_SHOWNORMAL; // SW_SHOWDEFAULT not defined under CE (#10216) +#else + sei.nShow = SW_SHOWDEFAULT; +#endif + + // avoid Windows message box in case of error for consistency with + // wxLaunchDefaultBrowser() even if don't show the error ourselves in this + // function + sei.fMask = SEE_MASK_FLAG_NO_UI; + + if ( ::ShellExecuteEx(&sei) ) + return true; +#endif + + return false; +} + // ---------------------------------------------------------------------------- // Launch default browser // ---------------------------------------------------------------------------- @@ -945,7 +991,7 @@ void wxQsort(void *const pbase, size_t total_elems, bool wxCocoaLaunchDefaultBrowser(const wxString& url, int flags); #endif -bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) +static bool DoLaunchDefaultBrowser(const wxString& urlOrig, int flags) { wxUnusedVar(flags); @@ -981,13 +1027,14 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) wxRegKey keyDDE(key, wxT("DDEExec")); if ( keyDDE.Exists() ) { - const wxString ddeTopic = wxRegKey(keyDDE, wxT("topic")); - // we only know the syntax of WWW_OpenURL DDE request for IE, // optimistically assume that all other browsers are compatible // with it + static const wxChar *TOPIC_OPEN_URL = wxT("WWW_OpenURL"); wxString ddeCmd; - bool ok = ddeTopic == wxT("WWW_OpenURL"); + wxRegKey keyTopic(keyDDE, wxT("topic")); + bool ok = keyTopic.Exists() && + keyTopic.QueryDefaultValue() == TOPIC_OPEN_URL; if ( ok ) { ddeCmd = keyDDE.QueryDefaultValue(); @@ -1000,7 +1047,7 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) // in is -1 (meaning "current") by default, replace it with // 0 which means "new" (see KB article 160957) ok = ddeCmd.Replace(wxT("-1"), wxT("0"), - false /* only first occurence */) == 1; + false /* only first occurrence */) == 1; } if ( ok ) @@ -1016,7 +1063,7 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) wxLogNull noLog; const wxString ddeServer = wxRegKey(keyDDE, wxT("application")); - if ( wxExecuteDDE(ddeServer, ddeTopic, ddeCmd) ) + if ( wxExecuteDDE(ddeServer, TOPIC_OPEN_URL, ddeCmd) ) return true; // this is not necessarily an error: maybe browser is @@ -1034,27 +1081,15 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) sei.lpFile = url.c_str(); sei.lpVerb = _T("open"); sei.nShow = SW_SHOWNORMAL; + sei.fMask = SEE_MASK_FLAG_NO_UI; // we give error message ourselves - ::ShellExecuteEx(&sei); - - const INT_PTR nResult = (INT_PTR)sei.hInstApp; - - // Firefox returns file not found for some reason, so make an exception - // for it - if ( nResult > 32 || nResult == SE_ERR_FNF ) - { -#ifdef __WXDEBUG__ - // Log something if SE_ERR_FNF happens - if ( nResult == SE_ERR_FNF ) - wxLogDebug(wxT("SE_ERR_FNF from ShellExecute -- maybe FireFox?")); -#endif // __WXDEBUG__ + if ( ::ShellExecuteEx(&sei) ) return true; - } #elif defined(__WXCOCOA__) // NOTE: We need to call the real implementation from src/cocoa/utils.mm // because the code must use Objective-C features. return wxCocoaLaunchDefaultBrowser(url, flags); -#elif defined(__WXMAC__) +#elif defined(__WXMAC__) && !defined(__WXOSX_IPHONE__) wxCFRef< CFURLRef > curl( CFURLCreateWithString( kCFAllocatorDefault, wxCFStringRef( url ), NULL ) ); OSStatus err = LSOpenCFURLRef( curl , NULL ); @@ -1153,6 +1188,15 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) return false; } +bool wxLaunchDefaultBrowser(const wxString& url, int flags) +{ + if ( flags & wxBROWSER_NOBUSYCURSOR ) + return DoLaunchDefaultBrowser(url, flags); + + wxBusyCursor bc; + return DoLaunchDefaultBrowser(url, flags); +} + // ---------------------------------------------------------------------------- // Menu accelerators related functions // ---------------------------------------------------------------------------- @@ -1382,7 +1426,7 @@ void wxInfoMessageBox(wxWindow* parent) 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-2007 wxWidgets team"), + _T("Copyright (c) 1995-2009 wxWidgets team"), wxPlatformInfo::Get().GetPortIdName().c_str(), wxMAJOR_VERSION, wxMINOR_VERSION, @@ -1469,8 +1513,8 @@ wxString wxGetPasswordFromUser(const wxString& message, #if wxUSE_COLOURDLG -wxColour wxGetColourFromUser(wxWindow *parent, - const wxColour& colInit, +wxColour wxGetColourFromUser(wxWindow *parent, + const wxColour& colInit, const wxString& caption, wxColourData *ptrData) { @@ -1638,14 +1682,18 @@ bool wxSafeYield(wxWindow *win, bool onlyIfNeeded) return rc; } -// 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) ) +// ---------------------------------------------------------------------------- +// wxApp::Yield() wrappers for backwards compatibility +// ---------------------------------------------------------------------------- + +bool wxYield() { - return true; // detectable auto-repeat is the only mode MSW supports + return wxTheApp && wxTheApp->Yield(); +} + +bool wxYieldIfNeeded() +{ + return wxTheApp && wxTheApp->Yield(true); } -#endif // !wxGTK #endif // wxUSE_GUI