# include <config.h>
#endif
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
#include <simgear/compiler.h>
#include <fstream>
# include <shellapi.h>
#endif
+#if defined(SG_MAC)
+# include <GUI/CocoaHelpers.h> // for cocoaOpenUrl
+#endif
+
#include "gui.h"
using std::string;
string msg = txt;
msg += '\n';
msg += throwable.getFormattedMessage();
- if (!std::strlen(throwable.getOrigin()) != 0) {
+ if (std::strlen(throwable.getOrigin()) != 0) {
msg += "\n (reported by ";
msg += throwable.getOrigin();
msg += ')';
openBrowser( "Docs/index.html" );
}
-bool openBrowser(string address)
+bool openBrowser(const std::string& aAddress)
{
bool ok = true;
-
+ string address(aAddress);
+
// do not resolve addresses with given protocol, i.e. "http://...", "ftp://..."
if (address.find("://")==string::npos)
{
}
}
-#ifndef _WIN32
-
- string command = globals->get_browser();
- string::size_type pos;
- if ((pos = command.find("%u", 0)) != string::npos)
- command.replace(pos, 2, address);
- else
- command += " " + address;
-
- command += " &";
- ok = (system( command.c_str() ) == 0);
-
-#else // _WIN32
+#ifdef SG_MAC
+ if (address.find("://")==string::npos) {
+ address = "file://" + address;
+ }
+
+ cocoaOpenUrl(address);
+#elif defined _WIN32
// Look for favorite browser
char win32_name[1024];
# endif
ShellExecute ( NULL, "open", win32_name, NULL, NULL,
SW_SHOWNORMAL ) ;
+#else
+ // Linux, BSD, SGI etc
+ string command = globals->get_browser();
+ string::size_type pos;
+ if ((pos = command.find("%u", 0)) != string::npos)
+ command.replace(pos, 2, address);
+ else
+ command += " \"" + address +"\"";
+ command += " &";
+ ok = (system( command.c_str() ) == 0);
#endif
mkDialog("The file is shown in your web browser window.");
char *filename = new char [24];
static int count = 1;
- static const SGPropertyNode *master_freeze
- = fgGetNode("/sim/freeze/master");
+ SGPropertyNode *master_freeze = fgGetNode("/sim/freeze/master");
bool freeze = master_freeze->getBoolValue();
if ( !freeze ) {
- fgSetBool("/sim/freeze/master", true);
+ master_freeze->setBoolValue(true);
}
fgSetBool("/sim/menubar/visibility", false);
fgSetBool("/sim/menubar/visibility", menu_status);
if ( !freeze ) {
- fgSetBool("/sim/freeze/master", false);
+ master_freeze->setBoolValue(false);
}
}
#endif // #if defined( TR_HIRES_SNAP)
{
using namespace flightgear;
- class GUISnapShotOperation :
+ SGPath nextScreenshotPath(const std::string& screenshotDir)
+ {
+ char filename[32];
+ static int count = 1;
+ while (count < 1000) {
+ snprintf(filename, 32, "fgfs-screen-%03d.png", count++);
+
+ SGPath p(screenshotDir);
+ p.append(filename);
+ if (!p.exists()) {
+ return p;
+ }
+ }
+
+ return SGPath();
+ }
+
+ class GUISnapShotOperation :
public GraphicsContextOperation
{
public:
string dir = fgGetString("/sim/paths/screenshot-dir");
if (dir.empty())
- dir = fgGetString("/sim/fg-current");
+ dir = SGPath::desktop().str();
_path.set(dir + '/');
if (_path.create_dir( 0755 )) {
SG_LOG(SG_GENERAL, SG_ALERT, "Cannot create screenshot directory '"
<< dir << "'. Trying home directory.");
- dir = fgGetString("/sim/fg-home");
- }
-
- char filename[24];
- static int count = 1;
- while (count < 1000) {
- snprintf(filename, 24, "fgfs-screen-%03d.png", count++);
-
- SGPath p(dir);
- p.append(filename);
- if (!p.exists()) {
- _path.set(p.str());
- break;
- }
+ dir = globals->get_fg_home();
}
+ _path = nextScreenshotPath(dir);
_xsize = fgGetInt("/sim/startup/xsize");
_ysize = fgGetInt("/sim/startup/ysize");
SGPath _path;
};
-}
+} // of anonymous namespace
osg::ref_ptr<GUISnapShotOperation> GUISnapShotOperation::_snapShotOp;
// do a screen snap shot
bool fgDumpSnapShot ()
{
-#if 1
// start snap shot operation, while needs to be executed in
// graphics context
return GUISnapShotOperation::start();
-#else
- // obsolete code => remove when new code is stable
- static SGConstPropertyNode_ptr master_freeze = fgGetNode("/sim/freeze/master");
-
- bool freeze = master_freeze->getBoolValue();
- if ( !freeze ) {
- fgSetBool("/sim/freeze/master", true);
- }
-
- int mouse = fgGetMouseCursor();
- fgSetMouseCursor(MOUSE_CURSOR_NONE);
-
- fgSetBool("/sim/signals/screenshot", true);
-
- FGRenderer *renderer = globals->get_renderer();
- renderer->resize( fgGetInt("/sim/startup/xsize"),
- fgGetInt("/sim/startup/ysize") );
-
- // we need two render frames here to clear the menu and cursor
- // ... not sure why but doing an extra fgRenderFrame() shouldn't
- // hurt anything
- renderer->update( true );
- renderer->update( true );
-
- string dir = fgGetString("/sim/paths/screenshot-dir");
- if (dir.empty())
- dir = fgGetString("/sim/fg-current");
-
- SGPath path(dir + '/');
- if (path.create_dir( 0755 )) {
- SG_LOG(SG_GENERAL, SG_ALERT, "Cannot create screenshot directory '"
- << dir << "'. Trying home directory.");
- dir = fgGetString("/sim/fg-home");
- }
-
- char filename[24];
- static int count = 1;
- while (count < 1000) {
- snprintf(filename, 24, "fgfs-screen-%03d.png", count++);
-
- SGPath p(dir);
- p.append(filename);
- if (!p.exists()) {
- path.set(p.str());
- break;
- }
- }
-
- bool result = sg_glDumpWindow(path.c_str(),
- fgGetInt("/sim/startup/xsize"),
- fgGetInt("/sim/startup/ysize"));
-
- fgSetString("/sim/paths/screenshot-last", path.c_str());
- fgSetBool("/sim/signals/screenshot", false);
-
- fgSetMouseCursor(mouse);
-
- if ( !freeze ) {
- fgSetBool("/sim/freeze/master", false);
- }
- return result;
-#endif
}
// do an entire scenegraph dump
string message;
static int count = 1;
- static const SGPropertyNode *master_freeze
- = fgGetNode("/sim/freeze/master");
+ SGPropertyNode *master_freeze = fgGetNode("/sim/freeze/master");
bool freeze = master_freeze->getBoolValue();
if ( !freeze ) {
- fgSetBool("/sim/freeze/master", true);
+ master_freeze->setBoolValue(true);
}
while (count < 1000) {
delete [] filename;
if ( !freeze ) {
- fgSetBool("/sim/freeze/master", false);
+ master_freeze->setBoolValue(false);
}
}
string message;
static int count = 1;
- static const SGPropertyNode *master_freeze
- = fgGetNode("/sim/freeze/master");
+ SGPropertyNode *master_freeze = fgGetNode("/sim/freeze/master");
bool freeze = master_freeze->getBoolValue();
if ( !freeze ) {
- fgSetBool("/sim/freeze/master", true);
+ master_freeze->setBoolValue(true);
}
while (count < 1000) {
delete [] filename;
if ( !freeze ) {
- fgSetBool("/sim/freeze/master", false);
+ master_freeze->setBoolValue(false);
}
}
void fgPrintVisibleSceneInfoCommand()
{
- static const SGPropertyNode *master_freeze
- = fgGetNode("/sim/freeze/master");
+ SGPropertyNode *master_freeze = fgGetNode("/sim/freeze/master");
bool freeze = master_freeze->getBoolValue();
if ( !freeze ) {
- fgSetBool("/sim/freeze/master", true);
+ master_freeze->setBoolValue(true);
}
flightgear::printVisibleSceneInfo(globals->get_renderer());
if ( !freeze ) {
- fgSetBool("/sim/freeze/master", false);
+ master_freeze->setBoolValue(false);
}
}
-
-
-