summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/imlib.c7
-rw-r--r--src/slideshow.c12
-rw-r--r--src/winwidget.c3
3 files changed, 21 insertions, 1 deletions
diff --git a/src/imlib.c b/src/imlib.c
index 4e8e790..ae9c1be 100644
--- a/src/imlib.c
+++ b/src/imlib.c
@@ -366,6 +366,13 @@ int feh_load_image(Imlib_Image * im, feh_file * file)
file->filename = real_filename;
#ifdef HAVE_LIBEXIF
+ /*
+ * if we're called from within feh_reload_image, file->ed is already
+ * populated.
+ */
+ if (file->ed) {
+ exif_data_unref(file->ed);
+ }
file->ed = exif_get_data(tmpname);
#endif
}
diff --git a/src/slideshow.c b/src/slideshow.c
index 07a1e94..2eb10da 100644
--- a/src/slideshow.c
+++ b/src/slideshow.c
@@ -225,6 +225,18 @@ void slideshow_change_image(winwidget winwid, int change, int render)
/* The for loop prevents us looping infinitely */
for (i = 0; i < our_filelist_len; i++) {
winwidget_free_image(winwid);
+#ifdef HAVE_LIBEXIF
+ /*
+ * An EXIF data chunk requires up to 50 kB of space. For large and
+ * long-running slideshows, this would acculumate gigabytes of
+ * EXIF data after a few days. We therefore do not cache EXIF data
+ * in slideshows.
+ */
+ if (FEH_FILE(winwid->file->data)->ed) {
+ exif_data_unref(FEH_FILE(winwid->file->data)->ed);
+ FEH_FILE(winwid->file->data)->ed = NULL;
+ }
+#endif
switch (change) {
case SLIDE_NEXT:
current_file = feh_list_jump(filelist, current_file, FORWARD, 1);
diff --git a/src/winwidget.c b/src/winwidget.c
index bfd987d..119c3af 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -1014,8 +1014,9 @@ void winwidget_rename(winwidget winwid, char *newname)
void winwidget_free_image(winwidget w)
{
- if (w->im)
+ if (w->im) {
gib_imlib_free_image(w->im);
+ }
w->im = NULL;
w->im_w = 0;
w->im_h = 0;