+// this function is only really implemented for X11-based ports, including GTK1
+// (GTK2 sets detectable auto-repeat automatically anyhow)
+#if !(defined(__WXX11__) || defined(__WXMOTIF__) || \
+ (defined(__WXGTK__) && !defined(__WXGTK20__)))
+bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) )
+{
+ return true;
+}
+#endif // !X11-based port
+
+// ----------------------------------------------------------------------------
+// Launch default browser
+// ----------------------------------------------------------------------------
+
+#if defined(__WXMSW__)
+
+// implemented in a port-specific utils source file:
+bool wxDoLaunchDefaultBrowser(const wxString& url, const wxString& scheme, int flags);
+
+#elif defined(__WXX11__) || defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXCOCOA__) || \
+ (defined(__WXMAC__) && !defined(__WXOSX_IPHONE__))
+
+// implemented in a port-specific utils source file:
+bool wxDoLaunchDefaultBrowser(const wxString& url, int flags);
+
+#else
+
+// a "generic" implementation:
+bool wxDoLaunchDefaultBrowser(const wxString& url, int flags)
+{
+ // on other platforms try to use mime types or wxExecute...
+
+ bool ok = false;
+ wxString cmd;
+
+#if wxUSE_MIMETYPE
+ wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(wxT("html"));
+ if ( ft )
+ {
+ wxString mt;
+ ft->GetMimeType(&mt);
+
+ ok = ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(url));
+ delete ft;
+ }
+#endif // wxUSE_MIMETYPE
+
+ if ( !ok || cmd.empty() )
+ {
+ // fallback to checking for the BROWSER environment variable
+ if ( !wxGetEnv(wxT("BROWSER"), &cmd) || cmd.empty() )
+ cmd << wxT(' ') << url;
+ }
+
+ ok = ( !cmd.empty() && wxExecute(cmd) );
+ if (ok)
+ return ok;
+
+ // no file type for HTML extension
+ wxLogError(_("No default application configured for HTML files."));
+
+ return false;
+}
+#endif
+
+static bool DoLaunchDefaultBrowserHelper(const wxString& urlOrig, int flags)
+{
+ // NOTE: we don't have to care about the wxBROWSER_NOBUSYCURSOR flag
+ // as it was already handled by wxLaunchDefaultBrowser
+
+ wxUnusedVar(flags);
+
+ wxString url(urlOrig), scheme;
+ wxURI uri(url);
+
+ // this check is useful to avoid that wxURI recognizes as scheme parts of
+ // the filename, in case urlOrig is a local filename
+ // (e.g. "C:\\test.txt" when parsed by wxURI reports a scheme == "C")
+ bool hasValidScheme = uri.HasScheme() && uri.GetScheme().length() > 1;
+
+#if defined(__WXMSW__)
+
+ // NOTE: when testing wxMSW's wxLaunchDefaultBrowser all possible forms
+ // of the URL/flags should be tested; e.g.:
+ //
+ // for (int i=0; i<2; i++)
+ // {
+ // // test arguments without a valid URL scheme:
+ // wxLaunchDefaultBrowser("C:\\test.txt", i==0 ? 0 : wxBROWSER_NEW_WINDOW);
+ // wxLaunchDefaultBrowser("wxwidgets.org", i==0 ? 0 : wxBROWSER_NEW_WINDOW);
+ //
+ // // test arguments with different valid schemes:
+ // wxLaunchDefaultBrowser("file:/C%3A/test.txt", i==0 ? 0 : wxBROWSER_NEW_WINDOW);
+ // wxLaunchDefaultBrowser("http://wxwidgets.org", i==0 ? 0 : wxBROWSER_NEW_WINDOW);
+ // wxLaunchDefaultBrowser("mailto:user@host.org", i==0 ? 0 : wxBROWSER_NEW_WINDOW);
+ // }
+ // (assuming you have a C:\test.txt file)
+
+ if ( !hasValidScheme )
+ {
+ if (wxFileExists(urlOrig) || wxDirExists(urlOrig))
+ {
+ scheme = "file";
+ // do not prepend the file scheme to the URL as ShellExecuteEx() doesn't like it
+ }
+ else
+ {
+ url.Prepend(wxS("http://"));
+ scheme = "http";
+ }
+ }
+ else if ( hasValidScheme )
+ {
+ scheme = uri.GetScheme();
+
+ if ( uri.GetScheme() == "file" )
+ {
+ // TODO: extract URLToFileName() to some always compiled in
+ // function
+#if wxUSE_FILESYSTEM
+ // ShellExecuteEx() doesn't like the "file" scheme when opening local files;
+ // remove it
+ url = wxFileSystem::URLToFileName(url).GetFullPath();
+#endif // wxUSE_FILESYSTEM
+ }
+ }
+
+ if (wxDoLaunchDefaultBrowser(url, scheme, flags))
+ return true;
+ //else: call wxLogSysError
+#else
+ if ( !hasValidScheme )
+ {
+ // set the scheme of url to "http" or "file" if it does not have one
+ if (wxFileExists(urlOrig) || wxDirExists(urlOrig))
+ url.Prepend(wxS("file://"));
+ else
+ url.Prepend(wxS("http://"));
+ }
+
+ if (wxDoLaunchDefaultBrowser(url, flags))
+ return true;
+ //else: call wxLogSysError
+#endif
+
+ wxLogSysError(_("Failed to open URL \"%s\" in default browser."),
+ url.c_str());
+
+ return false;
+}
+
+bool wxLaunchDefaultBrowser(const wxString& url, int flags)
+{
+ // NOTE: as documented, "url" may be both a real well-formed URL
+ // and a local file name
+
+ if ( flags & wxBROWSER_NOBUSYCURSOR )
+ return DoLaunchDefaultBrowserHelper(url, flags);
+
+ wxBusyCursor bc;
+ return DoLaunchDefaultBrowserHelper(url, flags);
+}