1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2024-11-16 01:57:09 +00:00

Make imlib_cache_{size,flush_interval} lua settings

This commit is contained in:
Pavel Labath 2010-08-29 14:31:22 +02:00
parent ebd8a6d9fa
commit eedb5241f8
4 changed files with 66 additions and 69 deletions

View File

@ -2568,10 +2568,6 @@ void clean_up_without_threads(void *memtofree1, void* memtofree2)
llua_shutdown_hook(); llua_shutdown_hook();
llua_close(); llua_close();
#endif /* BUILD_LUA */ #endif /* BUILD_LUA */
#ifdef BUILD_IMLIB2
if (out_to_x.get(*state))
cimlib_deinit();
#endif /* BUILD_IMLIB2 */
#if defined BUILD_WEATHER_XOAP || defined BUILD_RSS #if defined BUILD_WEATHER_XOAP || defined BUILD_RSS
xmlCleanupParser(); xmlCleanupParser();
#endif #endif
@ -2820,20 +2816,6 @@ char load_config_file(const char *f)
} }
#endif #endif
} }
#endif /* BUILD_X11 */
#ifdef BUILD_X11
#ifdef BUILD_IMLIB2
CONF("imlib_cache_size") {
if (value) {
cimlib_set_cache_size(atoi(value));
}
}
CONF("imlib_cache_flush_interval") {
if (value) {
cimlib_set_cache_flush_interval(atoi(value));
}
}
#endif /* BUILD_IMLIB2 */
#endif /* BUILD_X11 */ #endif /* BUILD_X11 */
CONF("update_interval_on_battery") { CONF("update_interval_on_battery") {
if (value) { if (value) {

View File

@ -35,6 +35,8 @@
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include "x11.h"
struct image_list_s { struct image_list_s {
char name[1024]; char name[1024];
Imlib_Image image; Imlib_Image image;
@ -52,26 +54,51 @@ Imlib_Updates updates, current_update;
/* our virtual framebuffer image we draw into */ /* our virtual framebuffer image we draw into */
Imlib_Image buffer, image; Imlib_Image buffer, image;
static int cache_size_set = 0; namespace {
Imlib_Context context;
/* flush the image cache ever X seconds */ conky::range_config_setting<unsigned int> imlib_cache_flush_interval(
static int cimlib_cache_flush_interval = 0; "imlib_cache_flush_interval", 0,
static int cimlib_cache_flush_last = 0; std::numeric_limits<unsigned int>::max(), 0, true
);
#define DEFAULT_IMLIB2_CACHE_SIZE 4096 * 1024 /* default cache size for loaded images */ int cimlib_cache_flush_last = 0;
void cimlib_set_cache_size(long size)
{
imlib_set_cache_size(size);
cache_size_set = 1;
} }
void cimlib_set_cache_flush_interval(long interval) void imlib_cache_size_setting::lua_setter(lua::state &l, bool init)
{ {
if (interval >= 0) { lua::stack_sentry s(l, -2);
cimlib_cache_flush_interval = interval;
} else { Base::lua_setter(l, init);
NORM_ERR("Imlib2: flush interval should be >= 0");
if(init && out_to_x.get(l)) {
image_list_start = image_list_end = NULL;
context = imlib_context_new();
imlib_context_push(context);
imlib_set_cache_size(do_convert(l, -1).first);
/* set the maximum number of colors to allocate for 8bpp and less to 256 */
imlib_set_color_usage(256);
/* dither for depths < 24bpp */
imlib_context_set_dither(1);
/* set the display , visual, colormap and drawable we are using */
imlib_context_set_display(display);
imlib_context_set_visual(window.visual);
imlib_context_set_colormap(window.colourmap);
imlib_context_set_drawable(window.drawable);
}
++s;
}
void imlib_cache_size_setting::cleanup(lua::state &l)
{
lua::stack_sentry s(l, -1);
if(out_to_x.get(l)) {
cimlib_cleanup();
imlib_context_disconnect_display();
imlib_context_pop();
imlib_context_free(context);
} }
} }
@ -86,35 +113,6 @@ void cimlib_cleanup(void)
image_list_start = image_list_end = NULL; image_list_start = image_list_end = NULL;
} }
Imlib_Context context;
void cimlib_init(Display *disp, Window drawable, Visual *visual, Colormap
colourmap)
{
image_list_start = image_list_end = NULL;
context = imlib_context_new();
imlib_context_push(context);
if (!cache_size_set) cimlib_set_cache_size(DEFAULT_IMLIB2_CACHE_SIZE);
/* set the maximum number of colors to allocate for 8bpp and less to 256 */
imlib_set_color_usage(256);
/* dither for depths < 24bpp */
imlib_context_set_dither(1);
/* set the display , visual, colormap and drawable we are using */
imlib_context_set_display(disp);
imlib_context_set_visual(visual);
imlib_context_set_colormap(colourmap);
imlib_context_set_drawable(drawable);
}
void cimlib_deinit(void)
{
cimlib_cleanup();
cache_size_set = 0;
imlib_context_disconnect_display();
imlib_context_pop();
imlib_context_free(context);
}
void cimlib_add_image(const char *args) void cimlib_add_image(const char *args)
{ {
struct image_list_s *cur = NULL; struct image_list_s *cur = NULL;
@ -236,7 +234,8 @@ void cimlib_render(int x, int y, int width, int height)
/* cheque if it's time to flush our cache */ /* cheque if it's time to flush our cache */
now = time(NULL); now = time(NULL);
if (cimlib_cache_flush_interval && now - cimlib_cache_flush_interval > cimlib_cache_flush_last) { if (imlib_cache_flush_interval.get(*state) &&
now - imlib_cache_flush_interval.get(*state) > cimlib_cache_flush_last) {
int size = imlib_get_cache_size(); int size = imlib_get_cache_size();
imlib_set_cache_size(0); imlib_set_cache_size(0);
imlib_set_cache_size(size); imlib_set_cache_size(size);

View File

@ -30,11 +30,23 @@
void cimlib_add_image(const char *name); void cimlib_add_image(const char *name);
void cimlib_set_cache_size(long size); void cimlib_set_cache_size(long size);
void cimlib_set_cache_flush_interval(long interval); void cimlib_set_cache_flush_interval(long interval);
void cimlib_init(Display *display, Window drawable, Visual *visual, Colormap colourmap);
void cimlib_deinit(void);
void cimlib_render(int x, int y, int width, int height); void cimlib_render(int x, int y, int width, int height);
void cimlib_cleanup(void); void cimlib_cleanup(void);
void print_image_callback(struct text_object *, char *, int); void print_image_callback(struct text_object *, char *, int);
class imlib_cache_size_setting: public conky::range_config_setting<unsigned long> {
typedef conky::range_config_setting<unsigned long> Base;
protected:
virtual void lua_setter(lua::state &l, bool init);
virtual void cleanup(lua::state &l);
public:
imlib_cache_size_setting()
: Base("imlib_cache_size", 0,
std::numeric_limits<unsigned long>::max(), 4096*1024, true)
{}
};
#endif /* _CONKY_IMBLI2_H_ */ #endif /* _CONKY_IMBLI2_H_ */

View File

@ -144,9 +144,6 @@ namespace priv {
return false; return false;
} }
#ifdef BUILD_IMLIB2 // FIXME: move this somewhere else
cimlib_init(display, window.drawable, window.visual, window.colourmap);
#endif /* BUILD_IMLIB2 */
XFlush(display); XFlush(display);
return true; return true;
} }
@ -256,7 +253,7 @@ namespace {
* The order of these settings cannot be completely arbitrary. Some of them depend on others, and * The order of these settings cannot be completely arbitrary. Some of them depend on others, and
* the setters are called in the order in which they are defined. The order should be: * the setters are called in the order in which they are defined. The order should be:
* display_name -> out_to_x -> everything colour related * display_name -> out_to_x -> everything colour related
* -> border_*, own_window_*, etc -> own_window -> double_buffer * -> border_*, own_window_*, etc -> own_window -> double_buffer -> imlib_cache_size
*/ */
conky::simple_config_setting<alignment> text_alignment("alignment", NONE, false); conky::simple_config_setting<alignment> text_alignment("alignment", NONE, false);
@ -315,6 +312,13 @@ priv::own_window_setting own_window;
priv::use_xdbe_setting use_xdbe; priv::use_xdbe_setting use_xdbe;
#endif #endif
#ifdef BUILD_IMLIB2
/*
* the only reason this is not in imlib2.cc is so that we can be sure it's setter executes after
* use_xdbe
*/
imlib_cache_size_setting imlib_cache_size;
#endif
/******************** </SETTINGS> ************************/ /******************** </SETTINGS> ************************/
#ifdef DEBUG #ifdef DEBUG