X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5519074c00c5b79c574e3bea13edc069dc7dd1a1..844cada1622b2923754493a4c8eb91b82232093e:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 2beddfe3a6..bc45db3b2b 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -75,23 +75,24 @@ #include "wx/statusbr.h" #endif // wxUSE_GUI +#ifndef __WXPALMOS5__ #ifndef __WXWINCE__ #include #else #include "wx/msw/wince/time.h" #endif +#endif // ! __WXPALMOS5__ #ifdef __WXMAC__ -#include "wx/mac/private.h" -#ifndef __DARWIN__ -#include "InternetConfig.h" -#endif +#include "wx/osx/private.h" #endif +#ifndef __WXPALMOS5__ #if !defined(__MWERKS__) && !defined(__WXWINCE__) #include #include #endif +#endif // ! __WXPALMOS5__ #if defined(__WXMSW__) #include "wx/msw/private.h" @@ -105,10 +106,6 @@ #if wxUSE_BASE -// ---------------------------------------------------------------------------- -// common data -// ---------------------------------------------------------------------------- - // ============================================================================ // implementation // ============================================================================ @@ -124,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; @@ -165,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() { @@ -183,10 +190,12 @@ wxString wxNow() #endif } +#if WXWIN_COMPATIBILITY_2_8 void wxUsleep(unsigned long milliseconds) { wxMilliSleep(milliseconds); } +#endif const wxChar *wxGetInstallPrefix() { @@ -223,6 +232,10 @@ bool wxIsPlatformLittleEndian() } +// ---------------------------------------------------------------------------- +// wxPlatform +// ---------------------------------------------------------------------------- + /* * Class to make it easier to specify platform-dependent values */ @@ -435,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; } @@ -644,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; @@ -710,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. @@ -922,9 +924,9 @@ void wxQsort(void *const pbase, size_t total_elems, } } +#endif // wxUSE_BASE -#endif // wxUSE_BASE // ============================================================================ // GUI-only functions from now on @@ -932,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 // ---------------------------------------------------------------------------- @@ -941,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); @@ -977,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(); @@ -996,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 ) @@ -1012,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 @@ -1030,50 +1081,26 @@ 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 nResult = (int) 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__) - OSStatus err; - ICInstance inst; - long int startSel; - long int endSel; +#elif defined(__WXMAC__) && !defined(__WXOSX_IPHONE__) + wxCFRef< CFURLRef > curl( CFURLCreateWithString( kCFAllocatorDefault, + wxCFStringRef( url ), NULL ) ); + OSStatus err = LSOpenCFURLRef( curl , NULL ); - err = ICStart(&inst, 'STKA'); // put your app creator code here if (err == noErr) { - if (err == noErr) - { - ConstStr255Param hint = 0; - startSel = 0; - endSel = url.length(); - err = ICLaunchURL(inst, hint, url.fn_str(), endSel, &startSel, &endSel); - if (err != noErr) - wxLogDebug(wxT("ICLaunchURL error %d"), (int) err); - } - ICStop(inst); return true; } else { - wxLogDebug(wxT("ICStart error %d"), (int) err); + wxLogDebug(wxT("Browser Launch error %d"), (int) err); return false; } #else @@ -1081,6 +1108,20 @@ bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) #ifdef __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. Only if that fails, try to find the right + // browser ourselves. + wxString path, xdg_open; + if ( wxGetEnv("PATH", &path) && + wxFindFileInPath(&xdg_open, path, "xdg-open") ) + { + if ( wxExecute(xdg_open + " " + url) ) + return true; + } + wxString desktop = wxTheApp->GetTraits()->GetDesktopEnvironment(); // GNOME and KDE desktops have some applications which should be always installed @@ -1147,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 // ---------------------------------------------------------------------------- @@ -1376,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, @@ -1463,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) { @@ -1555,7 +1605,20 @@ void wxEnableTopLevelWindows(bool enable) node->GetData()->Enable(enable); } +wxWindowDisabler::wxWindowDisabler(bool disable) +{ + m_disabled = disable; + if ( disable ) + DoDisable(); +} + wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) +{ + m_disabled = true; + DoDisable(winToSkip); +} + +void wxWindowDisabler::DoDisable(wxWindow *winToSkip) { // remember the top level windows which were already disabled, so that we // don't reenable them later @@ -1587,6 +1650,9 @@ wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) wxWindowDisabler::~wxWindowDisabler() { + if ( !m_disabled ) + return; + wxWindowList::compatibility_iterator node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { @@ -1616,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