Torsten Giebl wrote:
Hello !
if you add a basic API for clipboard stuff, i also would like to see a
ver basic api - merely just a function
bool open_url(const char* url);
I think instead adding it to SDL,
it is time to create a helper lib.
for those little functions.
CU
SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
good idea! i will start with my simple code snippet directly here.
i only have win32 code. but i have pasted the code from wxWidgets
library, that seems to be quite complete, and could be a good starting
point.
#ifdef _WIN32
#include <shellapi.h>
bool open_url(const string& url)
{
// > 32 means no error, <32 means some error happened
return (int)ShellExecute(GetActiveWindow(), “open”, url.c_str(), NULL, NULL, SW_SHOW) > 32;
}
#else
bool open_url(const string& url)
{
// todo
}
#endif
// todo; learn from wxWidgets how to open browser in linux / macos
/* // from wxWidgets
// ----------------------------------------------------------------------------
// Launch default browser
// ----------------------------------------------------------------------------
bool wxLaunchDefaultBrowser(const wxString& url)
{
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;
// 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() )
{
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 ) == 1 )// only first occurence
{
// 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”));
#endif
}
#elif wxUSE_MIMETYPE
// Non-windows way
wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension (_T(“html”));
if (!ft)
{
wxLogError(_T(“No default application can open .html extension”));
return false;
}
wxString mt;
ft->GetMimeType(&mt);
wxString cmd;
bool ok = ft->GetOpenCommand (&cmd, wxFileType::MessageParameters(finalurl));
delete ft;
if (ok)
{
if ( !wxExecute(cmd) )
{
wxLogError(_T(“Failed to launch application for wxLaunchDefaultBrowser”));
return false;
}
}
else
{
// fallback to checking for the BROWSER environment variable
cmd = wxGetenv(wxT(“BROWSER”));
if ( cmd.empty() || !wxExecute(cmd + wxT(" ") + finalurl) )
return false;
}
#else // !wxUSE_MIMETYPE && !(WXMSW && wxUSE_NATIVE_CONFIG)
success = false;
#endif
//success - hopefully
return success;
}
bool
wxExtHelpController::DisplayHelp(const wxString &relativeURL)
{
wxBusyCursor b; // display a busy cursor
#if defined(WXMSW)
wxString url;
url << m_MapFile << ‘\’ << relativeURL.BeforeFirst(’#’);
bool bOk = (int)ShellExecute(NULL, wxT(“open”), url.c_str(),
NULL, NULL, SW_SHOWNORMAL ) > 32;
if ( !bOk )
{
wxLogSysError(_(“Cannot open URL ‘%s’”), relativeURL.c_str());
return false;
}
return true;
#elif defined(WXPM)
wxString url;
url << m_MapFile << ‘\’ << relativeURL.BeforeFirst(’#’);
// will have to fix for OS/2, later…DW
// bool bOk = (int)ShellExecute(NULL, “open”, url,
// NULL, NULL, SW_SHOWNORMAL ) > 32;
// if ( !bOk )
// {
// wxLogSysError(_(“Cannot open URL ‘%s’”), relativeURL.c_str());
// return false;
// }
// else
return true;
#elif defined(DOS)
wxString command;
command = m_BrowserName;
command << wxT(" file://")
<< m_MapFile << WXEXTHELP_SEPARATOR << relativeURL;
return wxExecute(command) != 0;
#else // UNIX
wxString command;
#ifndef EMX
if(m_BrowserIsNetscape) // try re-loading first
{
wxString lockfile;
wxGetHomeDir(&lockfile);
#ifdef VMS
lockfile << WXEXTHELP_SEPARATOR << wxT(".netscape]lock.");
struct stat statbuf;
if(stat(lockfile.fn_str(), &statbuf) == 0)
#else
lockfile << WXEXTHELP_SEPARATOR << wxT(".netscape/lock");
struct stat statbuf;
if(lstat(lockfile.fn_str(), &statbuf) == 0)
// cannot use wxFileExists, because it’s a link pointing to a
// non-existing location if(wxFileExists(lockfile))
#endif
{
long success;
command << m_BrowserName << wxT(" -remote openURL(")
<< wxT(“file://”) << m_MapFile
<< WXEXTHELP_SEPARATOR << relativeURL << wxT(")");
success = wxExecute(command);
if(success != 0 ) // returns PID on success
return true;
}
}
#endif
command = m_BrowserName;
command << wxT(" file://")
<< m_MapFile << WXEXTHELP_SEPARATOR << relativeURL;
return wxExecute(command) != 0;
#endif
}
*/