aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client.cpp50
-rw-r--r--src/constants.h6
2 files changed, 40 insertions, 16 deletions
diff --git a/src/client.cpp b/src/client.cpp
index 6ee918ad0..611a73bb1 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -1704,25 +1704,42 @@ void Client::makeScreenshot(IrrlichtDevice *device)
{
irr::video::IVideoDriver *driver = device->getVideoDriver();
irr::video::IImage* const raw_image = driver->createScreenShot();
- if (raw_image) {
- irr::video::IImage* const image = driver->createImage(video::ECF_R8G8B8,
- raw_image->getDimension());
- if (image) {
- raw_image->copyTo(image);
+ if (!raw_image)
+ return;
- std::string filename;
+ time_t t = time(NULL);
+ struct tm *tm = localtime(&t);
- time_t t = time(NULL);
- struct tm *tm = localtime(&t);
- char timetstamp_c[16]; // YYYYMMDD_HHMMSS + '\0'
- strftime(timetstamp_c, sizeof(timetstamp_c), "%Y%m%d_%H%M%S", tm);
+ char timetstamp_c[64];
+ strftime(timetstamp_c, sizeof(timetstamp_c), "%FT%T", tm);
- filename = g_settings->get("screenshot_path")
- + DIR_DELIM
- + std::string("screenshot_")
- + std::string(timetstamp_c)
- + ".png";
+ std::string filename_base = g_settings->get("screenshot_path")
+ + DIR_DELIM
+ + std::string("screenshot_")
+ + std::string(timetstamp_c);
+ std::string filename_ext = ".png";
+ std::string filename;
+
+ // Try to find a unique filename
+ unsigned serial = 0;
+
+ while (serial < SCREENSHOT_MAX_SERIAL_TRIES) {
+ filename = filename_base + (serial > 0 ? ("-" + itos(serial)) : "") + filename_ext;
+ std::ifstream tmp(filename.c_str());
+ if (!tmp.good())
+ break; // File did not apparently exist, we'll go with it
+ serial++;
+ }
+
+ if (serial == SCREENSHOT_MAX_SERIAL_TRIES) {
+ infostream << "Could not find suitable filename for screenshot" << std::endl;
+ } else {
+ irr::video::IImage* const image =
+ driver->createImage(video::ECF_R8G8B8, raw_image->getDimension());
+
+ if (image) {
+ raw_image->copyTo(image);
std::ostringstream sstr;
if (driver->writeImageToFile(image, filename.c_str())) {
@@ -1734,8 +1751,9 @@ void Client::makeScreenshot(IrrlichtDevice *device)
infostream << sstr.str() << std::endl;
image->drop();
}
- raw_image->drop();
}
+
+ raw_image->drop();
}
// IGameDef interface
diff --git a/src/constants.h b/src/constants.h
index d7163bf68..22cadc5a8 100644
--- a/src/constants.h
+++ b/src/constants.h
@@ -97,6 +97,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
// TODO: Use case-insensitive player names instead of this hack.
#define PLAYER_FILE_ALTERNATE_TRIES 1000
+// For screenshots a serial number is appended to the filename + datetimestamp
+// if filename + datetimestamp is not unique.
+// This is the maximum number of attempts to try and add a serial to the end of
+// the file attempting to ensure a unique filename
+#define SCREENSHOT_MAX_SERIAL_TRIES 1000
+
/*
GUI related things
*/