[Date Prev][Date Next][Thread Prev][Thread Next][Thread Index]
[XaraXtreme-dev] Patch to fix wxLaunchDefaultBrowser's handling of file://
- From: Luke Hart <lukeh@xxxxxxxx>
- Date: Wed, 17 May 2006 10:19:19 +0100
- Subject: [XaraXtreme-dev] Patch to fix wxLaunchDefaultBrowser's handling of file://
All,
In order for the new Help handling code to work this patch must be
applied. The patch is derived from the head of the wxGTK 2.6 branch.
Luke
--- wxGTK-2.6.3/src/common/utilscmn.cpp 2006-05-17 10:11:53.000000000 +0100
+++ wxWidgets/src/common/utilscmn.cpp 2006-05-06 15:57:06.000000000 +0100
@@ -4,7 +4,7 @@
// Author: Julian Smart
// Modified by:
// Created: 29/01/98
-// RCS-ID: $Id: utilscmn.cpp,v 1.145.2.1 2005/10/06 13:29:33 VZ Exp $
+// RCS-ID: $Id: utilscmn.cpp,v 1.145.2.3 2006/05/06 14:57:06 VZ Exp $
// Copyright: (c) 1998 Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
@@ -93,6 +93,13 @@
#include "wx/msw/wince/time.h"
#endif
+#ifdef __WXMAC__
+#include "wx/mac/private.h"
+#ifndef __DARWIN__
+#include "InternetConfig.h"
+#endif
+#endif
+
#if !defined(__MWERKS__) && !defined(__WXWINCE__)
#include <sys/types.h>
#include <sys/stat.h>
@@ -100,6 +107,7 @@
#if defined(__WXMSW__)
#include "wx/msw/private.h"
+ #include "wx/msw/registry.h"
#endif
#if wxUSE_BASE
@@ -531,189 +539,99 @@
// Launch default browser
// ----------------------------------------------------------------------------
-bool wxLaunchDefaultBrowser(const wxString& url)
+bool wxLaunchDefaultBrowser(const wxString& urlOrig)
{
- bool success = true;
-
- wxString finalurl = url;
-
- //if it isn't a full url, try appending http:// to it
- if(wxURI(url).IsReference())
- finalurl = wxString(wxT("http://")) + url;
-
-#if defined(__WXMSW__) && wxUSE_CONFIG_NATIVE
-
- wxString command;
+ // set the scheme of url to http if it does not have one
+ wxString url(urlOrig);
+ if ( !wxURI(url).HasScheme() )
+ url.Prepend(wxT("http://"));
- // ShellExecute() always opens in the same window,
- // so do it manually for new window (from Mahogany)
- wxRegKey key(wxRegKey::HKCR, url.BeforeFirst(':') + wxT("\\shell\\open"));
- if ( key.Exists() )
+#if defined(__WXMSW__)
+ WinStruct<SHELLEXECUTEINFO> sei;
+ sei.lpFile = url.c_str();
+ sei.lpVerb = _T("open");
+ sei.nShow = SW_SHOWNORMAL;
+
+ ::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 )
{
- wxRegKey keyDDE(key, wxT("DDEExec"));
- if ( keyDDE.Exists() )
- {
- wxRegKey keyTopic(keyDDE, wxT("topic"));
- wxString ddeTopic = keyTopic.QueryDefaultValue();
-
- // we only know the syntax of WWW_OpenURL DDE request
- if ( ddeTopic == wxT("WWW_OpenURL") )
- {
- wxString ddeCmd = keyDDE.QueryDefaultValue();
-
- // this is a bit naive but should work as -1 can't appear
- // elsewhere in the DDE topic, normally
- if ( ddeCmd.Replace(wxT("-1"), wxT("0"),
- false /* only first occurence */) == 1 )
- {
- // and also replace the parameters
- if ( ddeCmd.Replace(wxT("%1"), url, false) == 1 )
- {
- // magic incantation understood by wxMSW
- command << wxT("WX_DDE#")
- << wxRegKey(key, wxT("command")).QueryDefaultValue() << wxT('#')
- << wxRegKey(keyDDE, wxT("application")).QueryDefaultValue()
- << wxT('#') << ddeTopic << wxT('#')
- << ddeCmd;
- }
- }
- }
- }
- }
-
- //Try wxExecute - if it doesn't work or the regkey stuff
- //above failed, fallback to opening the file in the same
- //browser window
- if ( command.empty() || !wxExecute(command) )
- {
- int nResult; //HINSTANCE error code
-
-#if !defined(__WXWINCE__)
- // CYGWIN and MINGW may have problems - so load ShellExecute
- // dynamically
- typedef HINSTANCE (WINAPI *LPShellExecute)(HWND hwnd, const wxChar* lpOperation,
- const wxChar* lpFile,
- const wxChar* lpParameters,
- const wxChar* lpDirectory,
- INT nShowCmd);
-
- HINSTANCE hShellDll = ::LoadLibrary(wxT("shell32.dll"));
- if(hShellDll == NULL)
- return false;
-
- LPShellExecute lpShellExecute =
- (LPShellExecute) ::GetProcAddress(hShellDll,
- wxString::Format(wxT("ShellExecute%s"),
-
-#if wxUSE_UNICODE
- wxT("W")
-#else
- wxT("A")
-#endif
-#ifdef __WXWINCE__
- )
-#else
- ).mb_str(wxConvLocal)
-#endif
- );
- if(lpShellExecute == NULL)
- return false;
-
- // Windows sometimes doesn't open the browser correctly when using mime
- // types, so do ShellExecute - i.e. start <url> (from James Carroll)
- nResult = (int) (*lpShellExecute)(NULL, NULL, finalurl.c_str(),
- NULL, wxT(""), SW_SHOWNORMAL);
- // Unload Shell32.dll
- ::FreeLibrary(hShellDll);
-#else
- //Windows CE does not have normal ShellExecute - but it has
- //ShellExecuteEx all the way back to version 1.0
-
-
- //Set up the SHELLEXECUTEINFO structure to pass to ShellExecuteEx
- SHELLEXECUTEINFO sei;
- sei.cbSize = sizeof(SHELLEXECUTEINFO);
- sei.dwHotKey = 0;
- sei.fMask = 0;
- sei.hIcon = NULL;
- sei.hInstApp = NULL;
- sei.hkeyClass = NULL;
- // Not in WinCE
-#if 0
- sei.hMonitor = NULL;
-#endif
- sei.hProcess = NULL;
- sei.hwnd = NULL;
- sei.lpClass = NULL;
- sei.lpDirectory = NULL;
- sei.lpFile = finalurl.c_str();
- sei.lpIDList = NULL;
- sei.lpParameters = NULL;
- sei.lpVerb = TEXT("open");
- sei.nShow = SW_SHOWNORMAL;
-
- //Call ShellExecuteEx
- ShellExecuteEx(&sei);
-
- //Get error code
- nResult = (int) sei.hInstApp;
-#endif
-
- // Hack for Firefox (returns file not found for some reason)
- // from Angelo Mandato's wxHyperlinksCtrl
- // HINSTANCE_ERROR == 32 (HINSTANCE_ERROR does not exist on Windows CE)
- if (nResult <= 32 && nResult != SE_ERR_FNF)
- return false;
-
#ifdef __WXDEBUG__
// Log something if SE_ERR_FNF happens
- if(nResult == SE_ERR_FNF)
- wxLogDebug(wxT("Got SE_ERR_FNF from ShellExecute - maybe FireFox"));
+ if ( nResult == SE_ERR_FNF )
+ wxLogDebug(wxT("SE_ERR_FNF from ShellExecute -- maybe FireFox?"));
+#endif // __WXDEBUG__
+ return true;
+ }
+#elif defined(__WXMAC__)
+ OSStatus err;
+ ICInstance inst;
+ SInt32 startSel;
+ SInt32 endSel;
+
+ err = ICStart(&inst, 'STKA'); // put your app creator code here
+ if (err == noErr)
+ {
+#if !TARGET_CARBON
+ err = ICFindConfigFile(inst, 0, NULL);
#endif
+ 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;
}
-
-#elif wxUSE_MIMETYPE
-
- // Non-windows way
- wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension (_T("html"));
- if (!ft)
+ else
{
- wxLogError(_T("No default application can open .html extension"));
+ wxLogDebug(wxT("ICStart error %d"), (int) err);
return false;
}
-
- wxString mt;
- ft->GetMimeType(&mt);
-
+#elif wxUSE_MIMETYPE
+ // Non-windows way
+ bool ok = false;
wxString cmd;
- bool ok = ft->GetOpenCommand (&cmd, wxFileType::MessageParameters(finalurl));
- delete ft;
- if (ok)
+ wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(_T("html"));
+ if ( ft )
{
- if ( !wxExecute(cmd) )
- {
- wxLogError(_T("Failed to launch application for wxLaunchDefaultBrowser"));
- return false;
- }
+ wxString mt;
+ ft->GetMimeType(&mt);
+
+ ok = ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(url));
+ delete ft;
}
- else
+
+ if ( !ok || cmd.empty() )
{
// fallback to checking for the BROWSER environment variable
cmd = wxGetenv(wxT("BROWSER"));
- if ( cmd.empty() || !wxExecute(cmd + wxT(" ") + finalurl) )
- return false;
+ if ( !cmd.empty() )
+ cmd << _T(' ') << url;
}
+ ok = ( !cmd.empty() && wxExecute(cmd) );
+ if (ok)
+ return ok;
-#else // !wxUSE_MIMETYPE && !(WXMSW && wxUSE_NATIVE_CONFIG)
+ // no file type for HTML extension
+ wxLogError(_T("No default application configured for HTML files."));
- success = false;
+#endif // !wxUSE_MIMETYPE && !__WXMSW__
-#endif
+ wxLogSysError(_T("Failed to open URL \"%s\" in default browser."),
+ url.c_str());
- //success - hopefully
- return success;
+ return false;
}
// ----------------------------------------------------------------------------