X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7999124f55d56f84d6779175e17557146dda5ee2..4d53859584e0fb987fef609c620937e46b0f751a:/src/common/utilscmn.cpp?ds=inline diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 24f2866ea4..b048ccd3c6 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: utilscmn.cpp +// Name: src/common/utilscmn.cpp // Purpose: Miscellaneous utility functions and classes // Author: Julian Smart // Modified by: @@ -89,6 +89,7 @@ #if defined(__WXMSW__) #include "wx/msw/private.h" + #include "wx/msw/registry.h" #endif #if wxUSE_BASE @@ -97,11 +98,6 @@ // common data // ---------------------------------------------------------------------------- -#if WXWIN_COMPATIBILITY_2_2 - const wxChar *wxInternalErrorStr = wxT("wxWidgets Internal Error"); - const wxChar *wxFatalErrorStr = wxT("wxWidgets Fatal Error"); -#endif // WXWIN_COMPATIBILITY_2_2 - // ============================================================================ // implementation // ============================================================================ @@ -520,14 +516,77 @@ long wxExecute(const wxString& command, // Launch default browser // ---------------------------------------------------------------------------- -bool wxLaunchDefaultBrowser(const wxString& urlOrig) +bool wxLaunchDefaultBrowser(const wxString& urlOrig, int flags) { + wxUnusedVar(flags); + // set the scheme of url to http if it does not have one wxString url(urlOrig); if ( !wxURI(url).HasScheme() ) url.Prepend(wxT("http://")); #if defined(__WXMSW__) + +#if wxUSE_IPC + if ( flags & wxBROWSER_NEW_WINDOW ) + { + // ShellExecuteEx() opens the URL in an existing window by default so + // we can't use it if we need a new window + wxRegKey key(wxRegKey::HKCR, url.BeforeFirst(':') + _T("\\shell\\open")); + if ( key.Exists() ) + { + 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 + wxString ddeCmd; + bool ok = ddeTopic == wxT("WWW_OpenURL"); + if ( ok ) + { + ddeCmd = keyDDE.QueryDefaultValue(); + ok = !ddeCmd.empty(); + } + + if ( ok ) + { + // for WWW_OpenURL, the index of the window to open the URL + // 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; + } + + if ( ok ) + { + // and also replace the parameters: the topic should + // contain a placeholder for the URL + ok = ddeCmd.Replace(wxT("%1"), url, false) == 1; + } + + if ( ok ) + { + // try to send it the DDE request now but ignore the errors + wxLogNull noLog; + + const wxString ddeServer = wxRegKey(keyDDE, wxT("application")); + if ( wxExecuteDDE(ddeServer, ddeTopic, ddeCmd) ) + return true; + + // this is not necessarily an error: maybe browser is + // simply not running, but no matter, in any case we're + // going to launch it using ShellExecuteEx() below now and + // we shouldn't try to open a new window if we open a new + // browser anyhow + } + } + } + } +#endif // wxUSE_IPC + WinStruct sei; sei.lpFile = url.c_str(); sei.lpVerb = _T("open");