>From 4f941c1fe7bc91b121f305b3a3239cf9a3944a6b Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Tue, 26 Dec 2023 15:35:17 +0100 Subject: [PATCH] Add some user control on image caching * lisp/image-mode.el (image-eager-flush): New custom to control image cache flush. (image-toggle-display-image): Flush image upon on file disk change. * src/image.c (Fimage_timestamp): New function to access image display timestamp. --- lisp/image-mode.el | 16 ++++++++++++++-- src/image.c | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lisp/image-mode.el b/lisp/image-mode.el index d5ca6348c92..ccea96ecc26 100644 --- a/lisp/image-mode.el +++ b/lisp/image-mode.el @@ -93,6 +93,12 @@ image-auto-resize-on-window-resize :version "27.1" :group 'image) +(defcustom image-eager-flush t + "Non-nil means flush image from cache eagerly." + :type 'boolean + :version "30.1" + :group 'image) + (defvar-local image-transform-resize nil "The image resize operation. Non-nil to resize the image upon first display. @@ -954,8 +960,14 @@ image-toggle-display-image (plist-put (cdr image) :width (plist-get (cdr image) :max-width))))) - ;; Discard any stale image data before looking it up again. - (image-flush image) + ;; Discard image data if its file has changed on disk. + (when (or image-eager-flush + (and filename + (time-less-p + (image-timestamp image) + (file-attribute-modification-time + (file-attributes filename))))) + (image-flush image)) (setq image (append image (image-transform-properties image))) (setq props `(display ,image diff --git a/src/image.c b/src/image.c index 651ec0b34e5..3c2697d1e6f 100644 --- a/src/image.c +++ b/src/image.c @@ -1650,6 +1650,30 @@ DEFUN ("image-metadata", Fimage_metadata, Simage_metadata, 1, 2, 0, return ext; } +DEFUN ("image-timestamp", Fimage_timestamp, Simage_timestamp, 1, 2, 0, + doc: /* Return the time in seconds at which the image SPEC was +last displayed. + +FRAME is the frame on which the image was displayed. FRAME nil or +omitted means use the selected frame. */) + (Lisp_Object spec, Lisp_Object frame) +{ + Lisp_Object timestamp; + + timestamp = Qnil; + if (valid_image_p (spec)) + { + struct frame *f = decode_window_system_frame (frame); + ptrdiff_t id = lookup_image (f, spec, -1); + struct image *img = IMAGE_FROM_ID (f, id); + + if (img) + timestamp = make_lisp_time (img->timestamp); + } + + return timestamp; +} + /*********************************************************************** Image type independent image structures @@ -12908,6 +12932,7 @@ syms_of_image (void) defsubr (&Simage_size); defsubr (&Simage_mask_p); defsubr (&Simage_metadata); + defsubr (&Simage_timestamp); defsubr (&Simage_cache_size); defsubr (&Simagep); -- 2.43.0