Skip to content
Snippets Groups Projects
Commit 27094917 authored by rswindell's avatar rswindell
Browse files

Added 2 options to the "Capture Control" (Alt-C) menu:

- Binary
- Binary with SAUCE

These options save the current screen to a "BinaryText" (*.bin) file,
optionally with a SAUCE record. If you want to screen-capture in SyncTERM,
this is how you do it. It'd be cool if the PrintScrn key did this without
any kind of popup/prompt, but that's a feature for another time
(if at all).
parent ab31c317
Branches
Tags
No related merge requests found
......@@ -21,6 +21,7 @@
#include "zmodem.h"
#include "xmodem.h"
#include "telnet_io.h"
#include "saucedefs.h"
#ifdef WITH_WXWIDGETS
#include "htmlwin.h"
#endif
......@@ -2031,24 +2032,73 @@ void capture_control(struct bbslist *bbs)
if(!cterm->log) {
struct file_pick fpick;
char *opts[3]={
char *opts[]={
"ASCII"
,"Raw"
,"Binary"
,"Binary with SAUCE"
,""
};
i=0;
uifc.helpbuf="`Capture Type`\n\n"
"~ ASCII ~ Strips out ANSI sequences\n"
"~ Raw ~ Leaves ANSI sequences in\n\n"
"Raw is useful for stealing ANSI screens from other systems.\n"
"Don't do that though. :-)";
uifc.helpbuf="~ Capture Type ~\n\n"
"`ASCII` ASCII only (no ANSI escape sequences)\n"
"`Raw` Preserves ANSI sequences\n"
"`Binary` Saves current screen in IBM-CGA/BinaryText format\n"
"`Binary with SAUCE` Saves current screen in BinaryText format with SAUCE\n"
"\n"
"Raw is useful for stealing ANSI screens from other systems.\n"
"Don't do that though. :-)";
if(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,NULL,"Capture Type",opts)!=-1) {
j=filepick(&uifc, "Capture File", &fpick, bbs->dldir, NULL, UIFC_FP_ALLOWENTRY);
j=filepick(&uifc, "Capture File", &fpick, bbs->dldir, i >= 2 ? "*.bin" : NULL
, UIFC_FP_ALLOWENTRY|UIFC_FP_OVERPROMPT);
check_exit(FALSE);
if(j!=-1 && fpick.files>=1)
cterm_openlog(cterm, fpick.selected[0], i?CTERM_LOG_RAW:CTERM_LOG_ASCII);
if(j!=-1 && fpick.files>=1) {
if(i >= 2) {
FILE* fp = fopen(fpick.selected[0], "wb");
if(fp == NULL) {
char err[256];
sprintf(err, "Error %u opening file '%s'", errno, fpick.selected[0]);
uifc.msg(err);
} else {
char msg[256];
uifc.pop("Writing to file");
fwrite(buf, sizeof(uint8_t), txtinfo.screenwidth * txtinfo.screenheight * 2, fp);
if(i > 2) {
time_t t = time(NULL);
struct tm* tm;
struct sauce sauce;
memset(&sauce, 0, sizeof(sauce));
memcpy(sauce.id, SAUCE_ID, sizeof(sauce.id));
memcpy(sauce.ver, SAUCE_VERSION, sizeof(sauce.ver));
memset(sauce.title, ' ', sizeof(sauce.title));
memset(sauce.author, ' ', sizeof(sauce.author));
memset(sauce.group, ' ', sizeof(sauce.group));
if(bbs != NULL) {
memcpy(sauce.title, bbs->name, min(strlen(bbs->name), sizeof(sauce.title)));
memcpy(sauce.author, bbs->user, min(strlen(bbs->user), sizeof(sauce.author)));
}
if((tm=localtime(&t)) != NULL) // The null-terminator overwrites the first byte of filesize
sprintf(sauce.date, "%04u%02u%02u"
,1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday);
sauce.filesize = ftell(fp); // LE
sauce.datatype = sauce_datatype_bin;
sauce.filetype = txtinfo.screenwidth / 2;
fputc(SAUCE_SEPARATOR, fp);
/* No comment block (no comments) */
fwrite(&sauce, sizeof(sauce), 1, fp);
}
fclose(fp);
uifc.pop(NULL);
sprintf(msg, "Screen saved to '%s'", getfname(fpick.selected[0]));
uifc.msg(msg);
}
} else
cterm_openlog(cterm, fpick.selected[0], i?CTERM_LOG_RAW:CTERM_LOG_ASCII);
}
filepick_free(&fpick);
}
else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment