Prompt for Subject, To, Cc when composing a new message

This commit is contained in:
Bobbi Webber-Manners 2020-06-29 18:29:05 -04:00
parent 7198868fb2
commit aecf9496ec

View File

@ -5,7 +5,6 @@
/////////////////////////////////////////////////////////////////
// TODO:
// - Prompt for To, cc, Subject for W)rite command
// - Update To/From if reply or forward
// - Automatically insert date
// - Fix terrible scrollback algorithm!!
@ -47,13 +46,22 @@ static unsigned char buf[READSZ];
#define ERR_NONFATAL 0
#define ERR_FATAL 1
/*
* Put cursor at beginning of PROMPT_ROW
*/
void goto_prompt_row(void) {
uint8_t i;
putchar(0x19); // HOME
for (i = 0; i < PROMPT_ROW - 1; ++i)
putchar(0x0a); // CURSOR DOWN
}
/*
* Show non fatal error in PROMPT_ROW
* Fatal errors are shown on a blank screen
*/
void error(uint8_t fatal, const char *fmt, ...) {
va_list v;
uint8_t i;
if (fatal) {
clrscr();
printf("\n\n%cFATAL ERROR:%c\n\n", 0x0f, 0x0e);
@ -64,16 +72,14 @@ void error(uint8_t fatal, const char *fmt, ...) {
cgetc();
exit(1);
} else {
putchar(0x19); // HOME
for (i = 0; i < PROMPT_ROW - 1; ++i)
putchar(0x0a); // CURSOR DOWN
putchar(0x1a); // CLEAR LINE
goto_prompt_row();
putchar(0x1a); // CLEAR LINE
va_start(v, fmt);
vprintf(fmt, v);
va_end(v);
printf(" - [Press Any Key]");
cgetc();
putchar(0x1a); // CLEAR LINE
putchar(0x1a); // CLEAR LINE
}
}
@ -516,10 +522,8 @@ void purge_deleted(void) {
if (unlink(filename)) {
error(ERR_NONFATAL, "Can't delete %s", filename);
}
putchar(0x19); // HOME
for (l = 0; l < PROMPT_ROW - 1; ++l)
putchar(0x0a); // CURSOR DOWN
putchar(0x1a); // CLEAR LINE
goto_prompt_row();
putchar(0x1a); // CLEAR LINE
printf("%u msgs deleted", ++delcount);
} else {
l = fwrite(h, 1, EMAILHDRS_SZ_ON_DISK, fp2);
@ -710,11 +714,8 @@ void copy_to_mailbox(struct emailhdrs *h, uint16_t idx,
}
// Make sure spinner is in the right place
if ((mode == 'R') || (mode == 'F')) {
putchar(0x19); // HOME
for (l = 0; l < PROMPT_ROW - 1; ++l)
putchar(0x0a); // CURSOR DOWN
}
if ((mode == 'R') || (mode == 'F'))
goto_prompt_row();
// Copy email
putchar(' '); // For spinner
@ -780,11 +781,8 @@ void copy_to_mailbox(struct emailhdrs *h, uint16_t idx,
* Prompt ok?
*/
char prompt_okay(char *msg) {
uint16_t i;
char c;
putchar(0x19); // HOME
for (i = 0; i < PROMPT_ROW - 1; ++i)
putchar(0x0a); // CURSOR DOWN
goto_prompt_row();
printf("%sSure? (y/n)", msg);
while (1) {
c = cgetc();
@ -796,7 +794,7 @@ char prompt_okay(char *msg) {
c = 1;
else
c = 0;
putchar(0x1a); // CLEAR LINE
putchar(0x1a); // CLEAR LINE
return c;
}
@ -844,10 +842,8 @@ uint8_t copy_to_mailbox_tagged(char *mbox, uint8_t delete) {
}
if (h->tag == 'T') {
h->tag = ' '; // Don't want it tagged in the destination
putchar(0x19); // HOME
for (l = 0; l < PROMPT_ROW - 1; ++l)
putchar(0x0a); // CURSOR DOWN
putchar(0x1a); // CLEAR LINE
goto_prompt_row();
putchar(0x1a); // CLEAR LINE
printf("%u/%u:", ++tagcount, total_tag);
copy_to_mailbox(h, count, mbox, delete, ' ');
}
@ -861,18 +857,18 @@ err:
/*
* Prompt for a name in the line below the menu, store it in userentry
* Returns number of chars read.
* prompt - Message to display before > prompt
* is_file - if 1, restrict chars to those allowed in ProDOS filename
*/
uint8_t prompt_for_name(void) {
uint8_t prompt_for_name(char *prompt, uint8_t is_file) {
uint16_t i;
char c;
putchar(0x19); // HOME
for (i = 0; i < PROMPT_ROW - 1; ++i)
putchar(0x0a); // CURSOR DOWN
printf(">>>");
goto_prompt_row();
printf("%s>", prompt);
i = 0;
while (1) {
c = cgetc();
if (!isalnum(c) && (c != 0x0d) && (c != 0x08) && (c != 0x7f) && (c != '.')) {
if (is_file && !isalnum(c) && (c != 0x0d) && (c != 0x08) && (c != 0x7f) && (c != '.')) {
putchar(7); // BELL
continue;
}
@ -899,9 +895,7 @@ uint8_t prompt_for_name(void) {
done:
userentry[i] = '\0';
putchar(0x1a); // CLEAR LINE
putchar(0x19); // HOME
for (c = 0; c < PROMPT_ROW - 1; ++c)
putchar(0x0a); // CURSOR DOWN
goto_prompt_row();
return i;
}
@ -927,10 +921,13 @@ void create_blank_outgoing() {
}
fprintf(fp, "From: %s\n", cfg_emailaddr);
fprintf(fp, "Subject: \n");
prompt_for_name("Subject", 0);
fprintf(fp, "Subject: %s\n", userentry);
fprintf(fp, "Date: TODO: put date in here!!\n"); // TODO
fprintf(fp, "To: \n");
fprintf(fp, "cc: \n\n");
prompt_for_name("To", 0);
fprintf(fp, "To: %s\n", userentry);
prompt_for_name("cc", 0);
fprintf(fp, "cc: %s\n\n", userentry);
fclose(fp);
// Update dest/NEXT.EMAIL, incrementing count by 1
@ -947,7 +944,6 @@ void create_blank_outgoing() {
*/
void keyboard_hdlr(void) {
struct emailhdrs *h;
uint8_t i;
while (1) {
char c = cgetc();
switch (c) {
@ -1027,19 +1023,17 @@ void keyboard_hdlr(void) {
break;
case 'c':
case 'C':
if (prompt_for_name())
if (prompt_for_name("Copy to mbox", 1))
copy_to_mailbox_tagged(userentry, 0);
break;
case 'm':
case 'M':
if (prompt_for_name())
if (prompt_for_name("Move to mbox", 1))
copy_to_mailbox_tagged(userentry, 1);
break;
case 'a':
case 'A':
putchar(0x19); // HOME
for (i = 0; i < PROMPT_ROW - 1; ++i)
putchar(0x0a); // CURSOR DOWN
goto_prompt_row();
copy_to_mailbox_tagged("RECEIVED", 1);
break;
case 'p':
@ -1049,12 +1043,12 @@ void keyboard_hdlr(void) {
break;
case 'n':
case 'N':
if (prompt_for_name())
if (prompt_for_name("New mbox", 1))
new_mailbox(userentry);
break;
case 's':
case 'S':
if (prompt_for_name())
if (prompt_for_name("Switch mbox", 1))
switch_mailbox(userentry);
break;
case 'w':