Skip to content

Commit

Permalink
Change format of screenshot names
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Zeno- committed Mar 31, 2015
1 parent ed10005 commit 862d4ea
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 16 deletions.
50 changes: 34 additions & 16 deletions src/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())) {
Expand All @@ -1734,8 +1751,9 @@ void Client::makeScreenshot(IrrlichtDevice *device)
infostream << sstr.str() << std::endl;
image->drop();
}
raw_image->drop();
}

raw_image->drop();
}

// IGameDef interface
Expand Down
6 changes: 6 additions & 0 deletions src/constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down

0 comments on commit 862d4ea

Please sign in to comment.