1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-27 10:54:40 +00:00

(uncache_image): New function.

(Fimage_refresh): New function.
This commit is contained in:
Chong Yidong 2007-05-21 23:03:49 +00:00
parent 62b0f126e0
commit 483e7ae0fa

View File

@ -1631,6 +1631,27 @@ make_image_cache ()
}
/* Search frame F for an images with spec SPEC, and free it. */
static void
uncache_image (f, spec)
struct frame *f;
Lisp_Object spec;
{
struct image_cache *c = FRAME_X_IMAGE_CACHE (f);
struct image *img = IMAGE_FROM_ID (f, lookup_image (f, spec));
unsigned hash = sxhash (spec, 0);
int i = hash % IMAGE_CACHE_BUCKETS_SIZE;
for (img = c->buckets[i]; img; img = img->next)
if (img->hash == hash && !NILP (Fequal (img->spec, spec)))
{
free_image (f, img);
break;
}
}
/* Free image cache of frame F. Be aware that X frames share images
caches. */
@ -1741,6 +1762,36 @@ FRAME t means clear the image caches of all frames. */)
}
DEFUN ("image-refresh", Fimage_refresh, Simage_refresh,
1, 2, 0,
doc: /* Refresh the image with specification SPEC on frame FRAME.
If SPEC specifies an image file, the displayed image is updated with
the current contents of that file.
FRAME nil or omitted means use the selected frame.
FRAME t means refresh the image on all frames. */)
(spec, frame)
Lisp_Object spec, frame;
{
if (!valid_image_p (spec))
error ("Invalid image specification");
if (EQ (frame, Qt))
{
Lisp_Object tail;
FOR_EACH_FRAME (tail, frame)
{
struct frame *f = XFRAME (frame);
if (FRAME_WINDOW_P (f))
uncache_image (f, spec);
}
}
else
uncache_image (check_x_frame (frame), spec);
return Qnil;
}
/* Compute masks and transform image IMG on frame F, as specified
by the image's specification, */
@ -8660,6 +8711,7 @@ non-numeric, there is no explicit limit on the size of images. */);
defsubr (&Sinit_image_library);
defsubr (&Sclear_image_cache);
defsubr (&Simage_refresh);
defsubr (&Simage_size);
defsubr (&Simage_mask_p);
defsubr (&Simage_extension_data);