X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/979a73474cf18beb6fa4104dd89dade05ce98c4b..091111d693989a6be93685726db948cccb203347:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 9b5d7cac6b..deffb94e27 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -943,7 +943,8 @@ bool wxLaunchDefaultApplication(const wxString& document, int flags) #ifdef __WXMAC__ static const char * const OPEN_CMD = "/usr/bin/open"; - if ( wxFileExists(OPEN_CMD) && wxExecute(OPEN_CMD + " " + document) ) + 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 @@ -959,16 +960,17 @@ bool wxLaunchDefaultApplication(const wxString& document, int flags) return true; } #elif defined(__WXMSW__) - const INT_PTR result = (INT_PTR)::ShellExecute - ( - NULL, // parent window - _T("open"), - document, - NULL, // parameters - NULL, // working directory - SW_SHOWDEFAULT - ); - if ( result > 32 ) + WinStruct sei; + sei.lpFile = document.wx_str(); + sei.lpVerb = _T("open"); + sei.nShow = SW_SHOWDEFAULT; + + // 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 @@ -1020,13 +1022,14 @@ static bool DoLaunchDefaultBrowser(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(); @@ -1039,7 +1042,7 @@ static bool DoLaunchDefaultBrowser(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 ) @@ -1055,7 +1058,7 @@ static bool DoLaunchDefaultBrowser(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 @@ -1073,22 +1076,10 @@ static bool DoLaunchDefaultBrowser(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.