Add configuration option to run the GC on exit
If "auto_gc" is enabled, the garbage collector for note files will be run on every exit. As this is an experimental feature and may cause data loss, this is disabled by default. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
parent
8d71923d4f
commit
711d5dea20
@ -623,6 +623,9 @@ These options control `calcurse` general behavior, as described below:
|
|||||||
will be automatically saved if `auto_save` is set to *no*. This means the
|
will be automatically saved if `auto_save` is set to *no*. This means the
|
||||||
user must press `S` (for saving) in order to retrieve its modifications.
|
user must press `S` (for saving) in order to retrieve its modifications.
|
||||||
|
|
||||||
|
`auto_gc` (default: *no*)::
|
||||||
|
Automatically run the garbage collector for note files when quitting.
|
||||||
|
|
||||||
`periodic_save` (default: *0*)::
|
`periodic_save` (default: *0*)::
|
||||||
If different from `0`, user's data will be automatically saved every
|
If different from `0`, user's data will be automatically saved every
|
||||||
*periodic_save* minutes. When an automatic save is performed, two asterisks
|
*periodic_save* minutes. When an automatic save is performed, two asterisks
|
||||||
|
@ -537,6 +537,8 @@ main (int argc, char **argv)
|
|||||||
case KEY_GENERIC_QUIT:
|
case KEY_GENERIC_QUIT:
|
||||||
if (conf.auto_save)
|
if (conf.auto_save)
|
||||||
io_save_cal (&conf, IO_SAVE_DISPLAY_BAR);
|
io_save_cal (&conf, IO_SAVE_DISPLAY_BAR);
|
||||||
|
if (conf.auto_gc)
|
||||||
|
note_gc ();
|
||||||
|
|
||||||
if (conf.confirm_quit)
|
if (conf.confirm_quit)
|
||||||
{
|
{
|
||||||
|
@ -219,6 +219,7 @@
|
|||||||
/* General configuration variables. */
|
/* General configuration variables. */
|
||||||
struct conf {
|
struct conf {
|
||||||
unsigned auto_save;
|
unsigned auto_save;
|
||||||
|
unsigned auto_gc;
|
||||||
unsigned periodic_save;
|
unsigned periodic_save;
|
||||||
unsigned confirm_quit;
|
unsigned confirm_quit;
|
||||||
unsigned confirm_delete;
|
unsigned confirm_delete;
|
||||||
|
46
src/custom.c
46
src/custom.c
@ -44,6 +44,7 @@
|
|||||||
/* Available configuration variables. */
|
/* Available configuration variables. */
|
||||||
enum conf_var {
|
enum conf_var {
|
||||||
CUSTOM_CONF_AUTOSAVE,
|
CUSTOM_CONF_AUTOSAVE,
|
||||||
|
CUSTOM_CONF_AUTOGC,
|
||||||
CUSTOM_CONF_PERIODICSAVE,
|
CUSTOM_CONF_PERIODICSAVE,
|
||||||
CUSTOM_CONF_CONFIRMQUIT,
|
CUSTOM_CONF_CONFIRMQUIT,
|
||||||
CUSTOM_CONF_CONFIRMDELETE,
|
CUSTOM_CONF_CONFIRMDELETE,
|
||||||
@ -75,6 +76,7 @@ struct conf_varname {
|
|||||||
static struct conf_varname conf_varmap[] =
|
static struct conf_varname conf_varmap[] =
|
||||||
{
|
{
|
||||||
{ CUSTOM_CONF_AUTOSAVE, "auto_save" },
|
{ CUSTOM_CONF_AUTOSAVE, "auto_save" },
|
||||||
|
{ CUSTOM_CONF_AUTOGC, "auto_gc" },
|
||||||
{ CUSTOM_CONF_PERIODICSAVE, "periodic_save" },
|
{ CUSTOM_CONF_PERIODICSAVE, "periodic_save" },
|
||||||
{ CUSTOM_CONF_CONFIRMQUIT, "confirm_quit" },
|
{ CUSTOM_CONF_CONFIRMQUIT, "confirm_quit" },
|
||||||
{ CUSTOM_CONF_CONFIRMDELETE, "confirm_delete" },
|
{ CUSTOM_CONF_CONFIRMDELETE, "confirm_delete" },
|
||||||
@ -291,6 +293,9 @@ custom_set_conf (struct conf *conf, enum conf_var var, char *val)
|
|||||||
case CUSTOM_CONF_AUTOSAVE:
|
case CUSTOM_CONF_AUTOSAVE:
|
||||||
return conf_parse_bool (&conf->auto_save, val);
|
return conf_parse_bool (&conf->auto_save, val);
|
||||||
break;
|
break;
|
||||||
|
case CUSTOM_CONF_AUTOGC:
|
||||||
|
return conf_parse_bool (&conf->auto_gc, val);
|
||||||
|
break;
|
||||||
case CUSTOM_CONF_PERIODICSAVE:
|
case CUSTOM_CONF_PERIODICSAVE:
|
||||||
return conf_parse_unsigned (&conf->periodic_save, val);
|
return conf_parse_unsigned (&conf->periodic_save, val);
|
||||||
break;
|
break;
|
||||||
@ -1017,6 +1022,7 @@ print_general_options (WINDOW *win, struct conf *conf)
|
|||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
AUTO_SAVE,
|
AUTO_SAVE,
|
||||||
|
AUTO_GC,
|
||||||
PERIODIC_SAVE,
|
PERIODIC_SAVE,
|
||||||
CONFIRM_QUIT,
|
CONFIRM_QUIT,
|
||||||
CONFIRM_DELETE,
|
CONFIRM_DELETE,
|
||||||
@ -1032,6 +1038,7 @@ print_general_options (WINDOW *win, struct conf *conf)
|
|||||||
int y;
|
int y;
|
||||||
char *opt[NB_OPTIONS] = {
|
char *opt[NB_OPTIONS] = {
|
||||||
_("auto_save = "),
|
_("auto_save = "),
|
||||||
|
_("auto_gc = "),
|
||||||
_("periodic_save = "),
|
_("periodic_save = "),
|
||||||
_("confirm_quit = "),
|
_("confirm_quit = "),
|
||||||
_("confirm_delete = "),
|
_("confirm_delete = "),
|
||||||
@ -1049,7 +1056,13 @@ print_general_options (WINDOW *win, struct conf *conf)
|
|||||||
mvwprintw (win, y + 1, XPOS,
|
mvwprintw (win, y + 1, XPOS,
|
||||||
_("(if set to YES, automatic save is done when quitting)"));
|
_("(if set to YES, automatic save is done when quitting)"));
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw (win, y, XPOS, "[2] %s ", opt[PERIODIC_SAVE]);
|
mvwprintw (win, y, XPOS, "[2] %s ", opt[AUTO_GC]);
|
||||||
|
print_bool_option_incolor (win, conf->auto_gc, y,
|
||||||
|
XPOS + 4 + strlen (opt[AUTO_GC]));
|
||||||
|
mvwprintw (win, y + 1, XPOS,
|
||||||
|
_("(run the garbage collector when quitting)"));
|
||||||
|
y += YOFF;
|
||||||
|
mvwprintw (win, y, XPOS, "[3] %s ", opt[PERIODIC_SAVE]);
|
||||||
custom_apply_attr (win, ATTR_HIGHEST);
|
custom_apply_attr (win, ATTR_HIGHEST);
|
||||||
mvwprintw (win, y, XPOS + 4 + strlen (opt[PERIODIC_SAVE]), "%d",
|
mvwprintw (win, y, XPOS + 4 + strlen (opt[PERIODIC_SAVE]), "%d",
|
||||||
conf->periodic_save);
|
conf->periodic_save);
|
||||||
@ -1058,41 +1071,41 @@ print_general_options (WINDOW *win, struct conf *conf)
|
|||||||
_("(if not null, automatically save data every 'periodic_save' "
|
_("(if not null, automatically save data every 'periodic_save' "
|
||||||
"minutes)"));
|
"minutes)"));
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw (win, y, XPOS, "[3] %s ", opt[CONFIRM_QUIT]);
|
mvwprintw (win, y, XPOS, "[4] %s ", opt[CONFIRM_QUIT]);
|
||||||
print_bool_option_incolor (win, conf->confirm_quit, y,
|
print_bool_option_incolor (win, conf->confirm_quit, y,
|
||||||
XPOS + 4 + strlen (opt[CONFIRM_QUIT]));
|
XPOS + 4 + strlen (opt[CONFIRM_QUIT]));
|
||||||
mvwprintw (win, y + 1, XPOS,
|
mvwprintw (win, y + 1, XPOS,
|
||||||
_("(if set to YES, confirmation is required before quitting)"));
|
_("(if set to YES, confirmation is required before quitting)"));
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw (win, y, XPOS, "[4] %s ", opt[CONFIRM_DELETE]);
|
mvwprintw (win, y, XPOS, "[5] %s ", opt[CONFIRM_DELETE]);
|
||||||
print_bool_option_incolor (win, conf->confirm_delete, y,
|
print_bool_option_incolor (win, conf->confirm_delete, y,
|
||||||
XPOS + 4 + strlen (opt[CONFIRM_DELETE]));
|
XPOS + 4 + strlen (opt[CONFIRM_DELETE]));
|
||||||
mvwprintw (win, y + 1, XPOS,
|
mvwprintw (win, y + 1, XPOS,
|
||||||
_("(if set to YES, confirmation is required "
|
_("(if set to YES, confirmation is required "
|
||||||
"before deleting an event)"));
|
"before deleting an event)"));
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw (win, y, XPOS, "[5] %s ", opt[SKIP_SYSTEM_DIAGS]);
|
mvwprintw (win, y, XPOS, "[6] %s ", opt[SKIP_SYSTEM_DIAGS]);
|
||||||
print_bool_option_incolor (win, conf->skip_system_dialogs, y,
|
print_bool_option_incolor (win, conf->skip_system_dialogs, y,
|
||||||
XPOS + 4 + strlen (opt[SKIP_SYSTEM_DIAGS]));
|
XPOS + 4 + strlen (opt[SKIP_SYSTEM_DIAGS]));
|
||||||
mvwprintw (win, y + 1, XPOS,
|
mvwprintw (win, y + 1, XPOS,
|
||||||
_("(if set to YES, messages about loaded "
|
_("(if set to YES, messages about loaded "
|
||||||
"and saved data will not be displayed)"));
|
"and saved data will not be displayed)"));
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw (win, y, XPOS, "[6] %s ", opt[SKIP_PROGRESS_BAR]);
|
mvwprintw (win, y, XPOS, "[7] %s ", opt[SKIP_PROGRESS_BAR]);
|
||||||
print_bool_option_incolor (win, conf->skip_progress_bar, y,
|
print_bool_option_incolor (win, conf->skip_progress_bar, y,
|
||||||
XPOS + 4 + strlen (opt[SKIP_PROGRESS_BAR]));
|
XPOS + 4 + strlen (opt[SKIP_PROGRESS_BAR]));
|
||||||
mvwprintw (win, y + 1, XPOS,
|
mvwprintw (win, y + 1, XPOS,
|
||||||
_("(if set to YES, progress bar will not be displayed "
|
_("(if set to YES, progress bar will not be displayed "
|
||||||
"when saving data)"));
|
"when saving data)"));
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw (win, y, XPOS, "[7] %s ", opt[WEEK_BEGINS_MONDAY]);
|
mvwprintw (win, y, XPOS, "[8] %s ", opt[WEEK_BEGINS_MONDAY]);
|
||||||
print_bool_option_incolor (win, calendar_week_begins_on_monday (), y,
|
print_bool_option_incolor (win, calendar_week_begins_on_monday (), y,
|
||||||
XPOS + 4 + strlen (opt[WEEK_BEGINS_MONDAY]));
|
XPOS + 4 + strlen (opt[WEEK_BEGINS_MONDAY]));
|
||||||
mvwprintw (win, y + 1, XPOS,
|
mvwprintw (win, y + 1, XPOS,
|
||||||
_("(if set to YES, monday is the first day of the week, "
|
_("(if set to YES, monday is the first day of the week, "
|
||||||
"else it is sunday)"));
|
"else it is sunday)"));
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw (win, y, XPOS, "[8] %s ", opt[OUTPUT_DATE_FMT]);
|
mvwprintw (win, y, XPOS, "[9] %s ", opt[OUTPUT_DATE_FMT]);
|
||||||
custom_apply_attr (win, ATTR_HIGHEST);
|
custom_apply_attr (win, ATTR_HIGHEST);
|
||||||
mvwprintw (win, y, XPOS + 4 + strlen (opt[OUTPUT_DATE_FMT]), "%s",
|
mvwprintw (win, y, XPOS + 4 + strlen (opt[OUTPUT_DATE_FMT]), "%s",
|
||||||
conf->output_datefmt);
|
conf->output_datefmt);
|
||||||
@ -1100,7 +1113,7 @@ print_general_options (WINDOW *win, struct conf *conf)
|
|||||||
mvwprintw (win, y + 1, XPOS,
|
mvwprintw (win, y + 1, XPOS,
|
||||||
_("(Format of the date to be displayed in non-interactive mode)"));
|
_("(Format of the date to be displayed in non-interactive mode)"));
|
||||||
y += YOFF;
|
y += YOFF;
|
||||||
mvwprintw (win, y, XPOS, "[9] %s ", opt[INPUT_DATE_FMT]);
|
mvwprintw (win, y, XPOS, "[0] %s ", opt[INPUT_DATE_FMT]);
|
||||||
custom_apply_attr (win, ATTR_HIGHEST);
|
custom_apply_attr (win, ATTR_HIGHEST);
|
||||||
mvwprintw (win, y, XPOS + 4 + strlen (opt[INPUT_DATE_FMT]), "%d",
|
mvwprintw (win, y, XPOS + 4 + strlen (opt[INPUT_DATE_FMT]), "%d",
|
||||||
conf->input_datefmt);
|
conf->input_datefmt);
|
||||||
@ -1171,6 +1184,9 @@ custom_general_config (struct conf *conf)
|
|||||||
conf->auto_save = !conf->auto_save;
|
conf->auto_save = !conf->auto_save;
|
||||||
break;
|
break;
|
||||||
case '2':
|
case '2':
|
||||||
|
conf->auto_gc = !conf->auto_gc;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
status_mesg (periodic_save_str, "");
|
status_mesg (periodic_save_str, "");
|
||||||
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
||||||
{
|
{
|
||||||
@ -1184,22 +1200,22 @@ custom_general_config (struct conf *conf)
|
|||||||
}
|
}
|
||||||
status_mesg (number_str, keys);
|
status_mesg (number_str, keys);
|
||||||
break;
|
break;
|
||||||
case '3':
|
case '4':
|
||||||
conf->confirm_quit = !conf->confirm_quit;
|
conf->confirm_quit = !conf->confirm_quit;
|
||||||
break;
|
break;
|
||||||
case '4':
|
case '5':
|
||||||
conf->confirm_delete = !conf->confirm_delete;
|
conf->confirm_delete = !conf->confirm_delete;
|
||||||
break;
|
break;
|
||||||
case '5':
|
case '6':
|
||||||
conf->skip_system_dialogs = !conf->skip_system_dialogs;
|
conf->skip_system_dialogs = !conf->skip_system_dialogs;
|
||||||
break;
|
break;
|
||||||
case '6':
|
case '7':
|
||||||
conf->skip_progress_bar = !conf->skip_progress_bar;
|
conf->skip_progress_bar = !conf->skip_progress_bar;
|
||||||
break;
|
break;
|
||||||
case '7':
|
case '8':
|
||||||
calendar_change_first_day_of_week ();
|
calendar_change_first_day_of_week ();
|
||||||
break;
|
break;
|
||||||
case '8':
|
case '9':
|
||||||
status_mesg (output_datefmt_str, "");
|
status_mesg (output_datefmt_str, "");
|
||||||
(void)strncpy (buf, conf->output_datefmt,
|
(void)strncpy (buf, conf->output_datefmt,
|
||||||
strlen (conf->output_datefmt) + 1);
|
strlen (conf->output_datefmt) + 1);
|
||||||
@ -1209,7 +1225,7 @@ custom_general_config (struct conf *conf)
|
|||||||
}
|
}
|
||||||
status_mesg (number_str, keys);
|
status_mesg (number_str, keys);
|
||||||
break;
|
break;
|
||||||
case '9':
|
case '0':
|
||||||
status_mesg (input_datefmt_str, "");
|
status_mesg (input_datefmt_str, "");
|
||||||
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
if (updatestring (win[STA].p, &buf, 0, 1) == 0)
|
||||||
{
|
{
|
||||||
|
5
src/io.c
5
src/io.c
@ -867,6 +867,11 @@ io_save_conf (struct conf *conf)
|
|||||||
(void)fprintf (fp, "auto_save=");
|
(void)fprintf (fp, "auto_save=");
|
||||||
(void)fprintf (fp, "%s\n", (conf->auto_save) ? "yes" : "no");
|
(void)fprintf (fp, "%s\n", (conf->auto_save) ? "yes" : "no");
|
||||||
|
|
||||||
|
(void)fprintf (fp, "\n# If this option is set to yes, "
|
||||||
|
"the GC is run automatically when quitting\n");
|
||||||
|
(void)fprintf (fp, "auto_gc=");
|
||||||
|
(void)fprintf (fp, "%s\n", (conf->auto_gc) ? "yes" : "no");
|
||||||
|
|
||||||
(void)fprintf (fp, "\n# If not null, perform automatic saves every "
|
(void)fprintf (fp, "\n# If not null, perform automatic saves every "
|
||||||
"'periodic_save' minutes\n");
|
"'periodic_save' minutes\n");
|
||||||
(void)fprintf (fp, "periodic_save=");
|
(void)fprintf (fp, "periodic_save=");
|
||||||
|
@ -125,6 +125,7 @@ vars_init (struct conf *conf)
|
|||||||
conf->confirm_quit = 1;
|
conf->confirm_quit = 1;
|
||||||
conf->confirm_delete = 1;
|
conf->confirm_delete = 1;
|
||||||
conf->auto_save = 1;
|
conf->auto_save = 1;
|
||||||
|
conf->auto_gc = 0;
|
||||||
conf->periodic_save = 0;
|
conf->periodic_save = 0;
|
||||||
conf->skip_system_dialogs = 0;
|
conf->skip_system_dialogs = 0;
|
||||||
conf->skip_progress_bar = 0;
|
conf->skip_progress_bar = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user