[SDL] SDL 1.3 roadmap...

Andre Krause post at andre-krause.net
Tue Oct 9 03:51:32 PDT 2007


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
}


*/



More information about the SDL mailing list