add option to update cache in a background process

the cli flag is undocumented for now, since it's experimental.

Closes: https://codeberg.org/nsxiv/nsxiv/issues/416
Closes: https://codeberg.org/nsxiv/nsxiv/pulls/425
Co-authored-by: explosion-mental <explosion0mental@gmail.com>
This commit is contained in:
NRK 2023-10-01 17:06:04 +06:00
parent 2093f36661
commit 1fc28278b5
3 changed files with 28 additions and 1 deletions

17
main.c
View File

@ -936,6 +936,23 @@ int main(int argc, char *argv[])
filecnt = fileidx; filecnt = fileidx;
fileidx = options->startnum < filecnt ? options->startnum : 0; fileidx = options->startnum < filecnt ? options->startnum : 0;
if (options->background_cache && !options->private_mode) {
pid_t ppid = getpid(); /* to check if parent is still alive or not */
switch (fork()) {
case 0:
tns_init(&tns, files, &filecnt, &fileidx, NULL);
while (filecnt > 0 && getppid() == ppid) {
tns_load(&tns, filecnt - 1, false, true);
remove_file(filecnt - 1, true);
}
exit(0);
break;
case -1:
error(0, errno, "fork failed");
break;
}
}
win_init(&win); win_init(&win);
img_init(&img, &win); img_init(&img, &win);
arl_init(&arl); arl_init(&arl);

View File

@ -274,6 +274,7 @@ struct opt {
bool thumb_mode; bool thumb_mode;
bool clean_cache; bool clean_cache;
bool private_mode; bool private_mode;
bool background_cache;
}; };
extern const opt_t *options; extern const opt_t *options;

View File

@ -81,7 +81,8 @@ void parse_options(int argc, char **argv)
*/ */
OPT_START = UCHAR_MAX, OPT_START = UCHAR_MAX,
OPT_AA, OPT_AA,
OPT_AL OPT_AL,
OPT_BG
}; };
static const struct optparse_long longopts[] = { static const struct optparse_long longopts[] = {
{ "framerate", 'A', OPTPARSE_REQUIRED }, { "framerate", 'A', OPTPARSE_REQUIRED },
@ -109,6 +110,8 @@ void parse_options(int argc, char **argv)
{ "null", '0', OPTPARSE_NONE }, { "null", '0', OPTPARSE_NONE },
{ "anti-alias", OPT_AA, OPTPARSE_OPTIONAL }, { "anti-alias", OPT_AA, OPTPARSE_OPTIONAL },
{ "alpha-layer", OPT_AL, OPTPARSE_OPTIONAL }, { "alpha-layer", OPT_AL, OPTPARSE_OPTIONAL },
/* TODO: document this when it's stable */
{ "bg-cache", OPT_BG, OPTPARSE_OPTIONAL },
{ 0 }, /* end */ { 0 }, /* end */
}; };
@ -145,6 +148,7 @@ void parse_options(int argc, char **argv)
_options.thumb_mode = false; _options.thumb_mode = false;
_options.clean_cache = false; _options.clean_cache = false;
_options.private_mode = false; _options.private_mode = false;
_options.background_cache = false;
if (argc > 0) { if (argc > 0) {
s = strrchr(argv[0], '/'); s = strrchr(argv[0], '/');
@ -264,6 +268,11 @@ void parse_options(int argc, char **argv)
error(EXIT_FAILURE, 0, "Invalid argument for option --alpha-layer: %s", op.optarg); error(EXIT_FAILURE, 0, "Invalid argument for option --alpha-layer: %s", op.optarg);
_options.alpha_layer = op.optarg == NULL; _options.alpha_layer = op.optarg == NULL;
break; break;
case OPT_BG:
if (op.optarg != NULL && !STREQ(op.optarg, "no"))
error(EXIT_FAILURE, 0, "Invalid argument for option --bg-cache: %s", op.optarg);
_options.background_cache = op.optarg == NULL;
break;
} }
} }