From c8f2013c77d2a7301c49f141cbd506f3a4e3d2cd Mon Sep 17 00:00:00 2001 From: mfranz Date: Sat, 26 Apr 2008 22:34:46 +0000 Subject: [PATCH] Nicolas: make screenshot target dir configurable (idea and first draft) --prop:sim/paths/screenshot-dir=/tmp --- src/GUI/gui.h | 2 +- src/GUI/gui_funcs.cxx | 52 +++++++++++++++++++--------------------- src/Main/fg_commands.cxx | 3 +-- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/GUI/gui.h b/src/GUI/gui.h index 02717d408..c4ec4962c 100644 --- a/src/GUI/gui.h +++ b/src/GUI/gui.h @@ -46,7 +46,7 @@ extern void mkDialog(const char *txt); extern void guiErrorMessage(const char *txt); extern void guiErrorMessage(const char *txt, const sg_throwable &throwable); -extern void fgDumpSnapShot(); +extern bool fgDumpSnapShot(); extern void fgDumpSceneGraph(); extern void fgDumpTerrainBranch(); diff --git a/src/GUI/gui_funcs.cxx b/src/GUI/gui_funcs.cxx index acad392ee..4a3bd8793 100644 --- a/src/GUI/gui_funcs.cxx +++ b/src/GUI/gui_funcs.cxx @@ -102,14 +102,6 @@ extern void fgUpdateHUD( GLfloat x_start, GLfloat y_start, #endif -// TODO: remove after the last hardcoded dialog has died -const char *gui_msg_OK = "OK"; -const char *gui_msg_NO = "NO"; -const char *gui_msg_YES = "YES"; -const char *gui_msg_CANCEL = "CANCEL"; -const char *gui_msg_RESET = "RESET"; - - const __fg_gui_fn_t __fg_gui_fn[] = { // File @@ -531,13 +523,9 @@ void fgHiResDumpWrapper ( puObject *obj ) { // do a screen snap shot -void fgDumpSnapShot () { +bool fgDumpSnapShot () { bool show_pu_cursor = false; - char *filename = new char [24]; - static int count = 1; - - static const SGPropertyNode *master_freeze - = fgGetNode("/sim/freeze/master"); + static SGConstPropertyNode_ptr master_freeze = fgGetNode("/sim/freeze/master"); bool freeze = master_freeze->getBoolValue(); if ( !freeze ) { @@ -546,15 +534,14 @@ void fgDumpSnapShot () { TurnCursorOff(); if ( !puCursorIsHidden() ) { - show_pu_cursor = true; - puHideCursor(); + show_pu_cursor = true; + puHideCursor(); } fgSetBool("/sim/signals/screenshot", true); FGRenderer *renderer = globals->get_renderer(); -// renderer->init(); renderer->resize( fgGetInt("/sim/startup/xsize"), - fgGetInt("/sim/startup/ysize") ); + 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 @@ -562,26 +549,36 @@ void fgDumpSnapShot () { renderer->update( true ); renderer->update( true ); + string dir = fgGetString("/sim/paths/screenshot-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) { - FILE *fp; snprintf(filename, 24, "fgfs-screen-%03d.ppm", count++); - if ( (fp = fopen(filename, "r")) == NULL ) + + SGPath p(dir); + p.append(filename); + if (!p.exists()) { + path.set(p.str()); break; - fclose(fp); + } } - int result = sg_glDumpWindow(filename, + int result = sg_glDumpWindow(path.c_str(), fgGetInt("/sim/startup/xsize"), fgGetInt("/sim/startup/ysize")); - fgSetString("/sim/last-screenshot", result ? filename : ""); + fgSetString("/sim/paths/screenshot-last", path.c_str()); fgSetBool("/sim/signals/screenshot", false); - //mkDialog (message.c_str()); - - delete [] filename; if ( show_pu_cursor ) { - puShowCursor(); + puShowCursor(); } TurnCursorOn(); @@ -589,6 +586,7 @@ void fgDumpSnapShot () { if ( !freeze ) { fgSetBool("/sim/freeze/master", false); } + return result != 0; } // do an entire scenegraph dump diff --git a/src/Main/fg_commands.cxx b/src/Main/fg_commands.cxx index dfc8f92c7..c25e36e5f 100644 --- a/src/Main/fg_commands.cxx +++ b/src/Main/fg_commands.cxx @@ -463,8 +463,7 @@ do_view_cycle (const SGPropertyNode * arg) static bool do_screen_capture (const SGPropertyNode * arg) { - fgDumpSnapShot(); - return true; + return fgDumpSnapShot(); } static bool -- 2.39.5