Change format of screenshot names

Filename screenshot_ + ISO 8601 format + [-serial]

i.e. screenshot_YYYY-MM-DDTHH::MM::SS[-serial].png

Serial is added if the filename + timestamp already exists and is in the range 1 to 999
This commit is contained in:
Craig Robbins 2015-03-31 16:13:42 +10:00
parent ed10005d38
commit 862d4ea328
2 changed files with 41 additions and 17 deletions

@ -1704,25 +1704,42 @@ void Client::makeScreenshot(IrrlichtDevice *device)
{ {
irr::video::IVideoDriver *driver = device->getVideoDriver(); irr::video::IVideoDriver *driver = device->getVideoDriver();
irr::video::IImage* const raw_image = driver->createScreenShot(); 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) { if (!raw_image)
raw_image->copyTo(image); return;
std::string filename;
time_t t = time(NULL); time_t t = time(NULL);
struct tm *tm = localtime(&t); 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);
filename = g_settings->get("screenshot_path") char timetstamp_c[64];
strftime(timetstamp_c, sizeof(timetstamp_c), "%FT%T", tm);
std::string filename_base = g_settings->get("screenshot_path")
+ DIR_DELIM + DIR_DELIM
+ std::string("screenshot_") + std::string("screenshot_")
+ std::string(timetstamp_c) + std::string(timetstamp_c);
+ ".png"; 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; std::ostringstream sstr;
if (driver->writeImageToFile(image, filename.c_str())) { if (driver->writeImageToFile(image, filename.c_str())) {
@ -1734,8 +1751,9 @@ void Client::makeScreenshot(IrrlichtDevice *device)
infostream << sstr.str() << std::endl; infostream << sstr.str() << std::endl;
image->drop(); image->drop();
} }
raw_image->drop();
} }
raw_image->drop();
} }
// IGameDef interface // IGameDef interface

@ -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. // TODO: Use case-insensitive player names instead of this hack.
#define PLAYER_FILE_ALTERNATE_TRIES 1000 #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 GUI related things
*/ */