fix: loading old frames due to multi-frame cache (#437)

by default imlib2 doesn't check the file's timestamp to avoid disk
activity when loading from cache. however, this ends up breaking our
autoreload functionality on multi-frame images.

the reason why single frame images weren't broken was because
`img_load()` calls `imlib_image_set_changes_on_disk()`, which tells
imlib2 to check the timestamp before loading from cache.

do the same thing for the multi-frame loader as well.

additionally add a comment to img_load() explaining what's going on.

Closes: https://codeberg.org/nsxiv/nsxiv/issues/436

Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/437
Reviewed-by: eylles <eylles@noreply.codeberg.org>
This commit is contained in:
NRK 2023-05-18 15:05:45 +00:00
parent 5c6745436f
commit 4b67816eae
1 changed files with 4 additions and 0 deletions

View File

@ -506,6 +506,7 @@ static bool img_load_multiframe(img_t *img, const fileinfo_t *file)
} }
imlib_context_set_image(frame); imlib_context_set_image(frame);
imlib_image_set_changes_on_disk(); /* see img_load() for rationale */
imlib_image_get_frame_info(&finfo); imlib_image_get_frame_info(&finfo);
assert(finfo.frame_count == (int)fcnt); assert(finfo.frame_count == (int)fcnt);
assert(finfo.canvas_w == img->w && finfo.canvas_h == img->h); assert(finfo.canvas_w == img->w && finfo.canvas_h == img->h);
@ -579,6 +580,9 @@ bool img_load(img_t *img, const fileinfo_t *file)
if ((img->im = img_open(file)) == NULL) if ((img->im = img_open(file)) == NULL)
return false; return false;
/* ensure that the image's timestamp is checked when loading from cache
* to avoid issues like: https://codeberg.org/nsxiv/nsxiv/issues/436
*/
imlib_image_set_changes_on_disk(); imlib_image_set_changes_on_disk();
/* since v1.7.5, Imlib2 can parse exif orientation from jpeg files. /* since v1.7.5, Imlib2 can parse exif orientation from jpeg files.