<varlistentry>
<term>
<command><option>image</option></command>
- <option><path to image> (-p x,y) (-s WxH)</option>
+ <option><path to image> (-p x,y) (-s WxH) (-n) (-f interval)</option>
</term>
<listitem>
- Renders an image from the path specified using IMLIB2. Takes 2 optional arguments, one being a position, the other an size. Changing the x,y position will move the position of the image, and changing the WxH will scale the image. Example: ${image /home/brenden/cheeseburger.jpg -p 20,20 -s 200x200} will render 'cheeseburger.jpg' at (20,20) scaled to 200x200 pixels. Conky does not make any attempt to adjust the position (or any other formatting) of images, they are just rendered as per the arguments passed. The only reason $image is part of the TEXT section, is to allow for runtime modifications, through $execp $lua_parse, $lua_read_parse, or some other method.
+ Renders an image from the path specified using Imlib2. Takes 4 optional arguments: a position, a size, a no-cache switch, and a cache flush interval. Changing the x,y position will move the position of the image, and changing the WxH will scale the image. If you specify the no-cache flag (-n), the image will not be cached. Alternately, you can specify the -f int switch to specify a cache flust interval for a particular image. Example: ${image /home/brenden/cheeseburger.jpg -p 20,20 -s 200x200} will render 'cheeseburger.jpg' at (20,20) scaled to 200x200 pixels. Conky does not make any attempt to adjust the position (or any other formatting) of images, they are just rendered as per the arguments passed. The only reason $image is part of the TEXT section, is to allow for runtime modifications, through $execp $lua_parse, $lua_read_parse, or some other method.
<para></para></listitem>
</varlistentry>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
+#include <time.h>
struct image_list_s {
char name[DEFAULT_TEXT_BUFFER_SIZE];
Imlib_Image image;
int x, y, w, h;
int wh_set;
+ char no_cache;
+ int flush_interval;
+ int flush_last;
struct image_list_s *next;
};
static int cache_size_set = 0;
+/* flush the image cache ever X seconds */
+static int cimlib_cache_flush_interval = 0;
+static int cimlib_cache_flush_last = 0;
+
#define DEFAULT_CACHE_SIZE 4096 * 1024 /* default cache size for loaded images */
void cimlib_set_cache_size(long size)
cache_size_set = 1;
}
+void cimlib_set_cache_flush_interval(long interval)
+{
+ cimlib_cache_flush_interval = interval;
+}
+
void cimlib_cleanup(void)
{
struct image_list_s *cur = image_list_start, *last = NULL;
memset(cur, 0, sizeof(struct image_list_s));
if (!sscanf(args, "%1024s", cur->name)) {
- ERR("Invalid args for $image. Format is: '<path to image> (-p x,y) (-s WxH)' (got '%s')", args);
+ ERR("Invalid args for $image. Format is: '<path to image> (-p x,y) (-s WxH) (-n) (-f interval)' (got '%s')", args);
}
to_real_path(cur->name, cur->name);
// now we check for optional args
}
}
+ tmp = strstr(args, "-n");
+ if (tmp) {
+ cur->no_cache = 1;
+ }
+
+ tmp = strstr(args, "-f ");
+ if (tmp) {
+ tmp += 3;
+ if (sscanf(tmp, "%d", &cur->flush_interval)) {
+ cur->no_cache = 0;
+ }
+ }
+
if (image_list_end) {
image_list_end->next = cur;
image_list_end = cur;
image = imlib_load_image(cur->name);
if (image) {
int w, h;
- DBGP("Drawing image '%s' at (%i,%i) scaled to %ix%i", cur->name, cur->x, cur->y, cur->w, cur->h);
+ time_t now = time(NULL);
+ DBGP("Drawing image '%s' at (%i,%i) scaled to %ix%i, caching interval set to %i (with -n opt %i)", cur->name, cur->x, cur->y, cur->w, cur->h, cur->flush_interval, cur->no_cache);
imlib_context_set_image(image);
/* turn alpha channel on */
imlib_image_set_has_alpha(1);
imlib_blend_image_onto_image(image, 1, 0, 0, w, h,
cur->x, cur->y, cur->w, cur->h);
imlib_context_set_image(image);
- imlib_free_image();
+ if (cur->no_cache || (cur->flush_interval && now - cur->flush_interval > cur->flush_last)) {
+ imlib_free_image_and_decache();
+ cur->flush_last = now;
+ } else {
+ imlib_free_image();
+ }
if (cur->x < *clip_x) *clip_x = cur->x;
if (cur->y < *clip_y) *clip_y = cur->y;
if (cur->x + cur->w > *clip_x2) *clip_x2 = cur->x + cur->w;
{
int clip_x = INT_MAX, clip_y = INT_MAX;
int clip_x2 = 0, clip_y2 = 0;
+ time_t now;
if (!image_list_start) return; /* are we actually drawing anything? */
+
+ /* cheque if it's time to flush our cache */
+ now = time(NULL);
+ if (cimlib_cache_flush_interval && now - cimlib_cache_flush_interval > cimlib_cache_flush_last) {
+ imlib_flush_loaders();
+ cimlib_cache_flush_last = now;
+ DBGP("Flushing Imlib2 cache (%li)\n", now);
+ }
+
/* take all the little rectangles to redraw and merge them into
* something sane for rendering */
buffer = imlib_create_image(width, height);