forked from enlightenment/enlightenment
e_icon - remove icon cache code - its disabled anyway with ifdefs
this isnt used so it just adds complexity/code to work on. remove it. it would need a rewrite anyway as using a single file is hugely inefficient as eet has to doa full rewrite of the file every modification... it also duplicated icons in memory and dint load directly from file etc. so... remove anyway.
This commit is contained in:
parent
409230ee35
commit
45b6536a20
366
src/bin/e_icon.c
366
src/bin/e_icon.c
|
@ -1,7 +1,5 @@
|
|||
#include "e.h"
|
||||
|
||||
//#define USE_ICON_CACHE
|
||||
|
||||
typedef struct _E_Smart_Data E_Smart_Data;
|
||||
typedef struct _Cache_Item Cache_Item;
|
||||
typedef struct _Cache Cache;
|
||||
|
@ -14,10 +12,6 @@ struct _E_Smart_Data
|
|||
const char *fdo;
|
||||
Ecore_Timer *guessing_animation;
|
||||
Ecore_Timer *timer, *fdo_reload_timer;
|
||||
#ifdef USE_ICON_CACHE
|
||||
const char *file;
|
||||
Cache_Item *ci;
|
||||
#endif
|
||||
double last_resize;
|
||||
int size;
|
||||
int frame, frame_count;
|
||||
|
@ -64,90 +58,18 @@ static void _e_icon_smart_clip_unset(Evas_Object *obj);
|
|||
static void _e_icon_obj_prepare(Evas_Object *obj, E_Smart_Data *sd);
|
||||
static void _e_icon_preloaded(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
|
||||
#ifdef USE_ICON_CACHE
|
||||
static Eina_Bool _e_icon_cache_find(Evas_Object *o, const char *file);
|
||||
static void _e_icon_cache_icon_loaded(Cache_Item *ci);
|
||||
static void _e_icon_cache_icon_try_next(Cache_Item *ci);
|
||||
static void _e_icon_cache_item_free(void *data);
|
||||
static void _e_icon_obj_del(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
#endif
|
||||
|
||||
/* local subsystem globals */
|
||||
static Evas_Smart *_e_smart = NULL;
|
||||
|
||||
#ifdef USE_ICON_CACHE
|
||||
static Cache *_cache = NULL;
|
||||
static E_Config_DD *cache_edd = NULL;
|
||||
static E_Config_DD *cache_item_edd = NULL;
|
||||
#define DBG(...)
|
||||
#endif
|
||||
|
||||
EINTERN int
|
||||
e_icon_init(void)
|
||||
{
|
||||
#ifdef USE_ICON_CACHE
|
||||
|
||||
Eet_File *ef;
|
||||
char buf[PATH_MAX];
|
||||
|
||||
#undef T
|
||||
#undef D
|
||||
#define T Cache_Item
|
||||
#define D cache_item_edd
|
||||
D = E_CONFIG_DD_NEW("Cache_Item", T);
|
||||
E_CONFIG_VAL(D, T, timestamp, UINT);
|
||||
#undef T
|
||||
#undef D
|
||||
#define T Cache
|
||||
#define D cache_edd
|
||||
D = E_CONFIG_DD_NEW("Cache", T);
|
||||
E_CONFIG_HASH(D, T, hash, cache_item_edd);
|
||||
#undef T
|
||||
#undef D
|
||||
|
||||
e_user_dir_concat_static(buf, "icon_cache.eet");
|
||||
|
||||
ef = eet_open(buf, EET_FILE_MODE_READ_WRITE);
|
||||
if (!ef) return 1; /* not critical */
|
||||
|
||||
_cache = eet_data_read(ef, cache_edd, "idx");
|
||||
if (!_cache)
|
||||
_cache = E_NEW(Cache, 1);
|
||||
|
||||
if (!_cache->hash)
|
||||
_cache->hash = eina_hash_string_superfast_new(_e_icon_cache_item_free);
|
||||
|
||||
eet_close(ef);
|
||||
|
||||
_cache->file = strdup(buf);
|
||||
|
||||
_cache->ef = NULL;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
EINTERN int
|
||||
e_icon_shutdown(void)
|
||||
{
|
||||
#ifdef USE_ICON_CACHE
|
||||
if (_cache)
|
||||
{
|
||||
E_FREE(_cache->file);
|
||||
|
||||
if (_cache->ef)
|
||||
eet_close(_cache->ef);
|
||||
|
||||
if (_cache->load_queue)
|
||||
eina_list_free(_cache->load_queue);
|
||||
|
||||
eina_hash_free(_cache->hash);
|
||||
E_FREE(_cache);
|
||||
}
|
||||
|
||||
E_CONFIG_DD_FREE(cache_item_edd);
|
||||
E_CONFIG_DD_FREE(cache_edd);
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -170,10 +92,6 @@ _e_icon_obj_prepare(Evas_Object *obj, E_Smart_Data *sd)
|
|||
|
||||
pclip = evas_object_clip_get(sd->obj);
|
||||
evas_object_del(sd->obj);
|
||||
#ifdef USE_ICON_CACHE
|
||||
sd->ci = NULL;
|
||||
eina_stringshare_replace(&sd->file, NULL);
|
||||
#endif
|
||||
sd->obj = evas_object_image_add(evas_object_evas_get(obj));
|
||||
if (!sd->animated)
|
||||
evas_object_image_scale_hint_set(sd->obj,
|
||||
|
@ -258,14 +176,6 @@ e_icon_file_set(Evas_Object *obj, const char *file)
|
|||
evas_object_image_load_size_set(sd->obj, sd->size, sd->size);
|
||||
if (sd->preload) evas_object_hide(sd->obj);
|
||||
|
||||
#ifdef USE_ICON_CACHE
|
||||
if (_e_icon_cache_find(obj, file))
|
||||
{
|
||||
_e_icon_smart_reconfigure(sd);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (sd->preload)
|
||||
evas_object_image_load_head_skip_set(sd->obj, EINA_TRUE);
|
||||
evas_object_image_file_set(sd->obj, file, NULL);
|
||||
|
@ -282,23 +192,8 @@ e_icon_file_set(Evas_Object *obj, const char *file)
|
|||
else if (evas_object_visible_get(obj))
|
||||
{
|
||||
evas_object_show(sd->obj);
|
||||
#ifdef USE_ICON_CACHE
|
||||
_e_icon_cache_icon_loaded(sd->ci);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef USE_ICON_CACHE
|
||||
else
|
||||
{
|
||||
evas_object_event_callback_del_full(sd->obj, EVAS_CALLBACK_DEL,
|
||||
_e_icon_obj_del, obj);
|
||||
_cache->load_queue = eina_list_remove(_cache->load_queue, sd->ci);
|
||||
eina_stringshare_del(sd->ci->id);
|
||||
E_FREE(sd->ci);
|
||||
sd->ci = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
_e_icon_smart_reconfigure(sd);
|
||||
}
|
||||
|
||||
|
@ -534,13 +429,6 @@ e_icon_file_get(const Evas_Object *obj, const char **file, const char **group)
|
|||
if (file) *file = NULL;
|
||||
if (group) *group = NULL;
|
||||
if (!(sd = evas_object_smart_data_get(obj))) return EINA_FALSE;
|
||||
#ifdef USE_ICON_CACHE
|
||||
if (sd->file)
|
||||
{
|
||||
if (file) *file = sd->file;
|
||||
return EINA_TRUE;
|
||||
}
|
||||
#endif
|
||||
if (sd->edje)
|
||||
{
|
||||
edje_object_file_get(sd->obj, file, group);
|
||||
|
@ -856,9 +744,6 @@ _e_icon_preloaded(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|||
sd->invalid = 1;
|
||||
sd->loading = 0;
|
||||
_e_icon_smart_reconfigure(sd);
|
||||
#ifdef USE_ICON_CACHE
|
||||
_e_icon_cache_icon_loaded(sd->ci);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -897,9 +782,6 @@ _e_icon_smart_del(Evas_Object *obj)
|
|||
evas_object_del(sd->obj);
|
||||
evas_object_del(sd->eventarea);
|
||||
if (sd->fdo) eina_stringshare_del(sd->fdo);
|
||||
#ifdef USE_ICON_CACHE
|
||||
if (sd->file) eina_stringshare_del(sd->file);
|
||||
#endif
|
||||
if (sd->fdo_reload_timer) ecore_timer_del(sd->fdo_reload_timer);
|
||||
if (sd->timer) ecore_timer_del(sd->timer);
|
||||
if (sd->guessing_animation) ecore_timer_del(sd->guessing_animation);
|
||||
|
@ -1010,10 +892,6 @@ _e_icon_smart_show(Evas_Object *obj)
|
|||
if (!((sd->preload) && (sd->loading)))
|
||||
{
|
||||
if (!sd->invalid) evas_object_show(sd->obj);
|
||||
#ifdef USE_ICON_CACHE
|
||||
if (!sd->preload)
|
||||
_e_icon_cache_icon_loaded(sd->ci);
|
||||
#endif
|
||||
}
|
||||
|
||||
evas_object_show(sd->eventarea);
|
||||
|
@ -1057,247 +935,3 @@ _e_icon_smart_clip_unset(Evas_Object *obj)
|
|||
evas_object_clip_unset(sd->obj);
|
||||
evas_object_clip_unset(sd->eventarea);
|
||||
}
|
||||
|
||||
#ifdef USE_ICON_CACHE
|
||||
|
||||
static void
|
||||
_e_icon_cache_item_free(void *data)
|
||||
{
|
||||
Cache_Item *ci = data;
|
||||
eina_stringshare_del(ci->id);
|
||||
E_FREE(ci);
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_e_icon_cache_save(void *data)
|
||||
{
|
||||
if (_cache->load_queue)
|
||||
{
|
||||
Cache_Item *ci;
|
||||
Eina_List *l;
|
||||
|
||||
/* EINA_LIST_FOREACH(_cache->load_queue, l, ci)
|
||||
* printf(" : %s\n", ci->id); */
|
||||
|
||||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
eet_sync(_cache->ef);
|
||||
eet_close(_cache->ef);
|
||||
|
||||
_cache->ef = NULL;
|
||||
_cache->timer = NULL;
|
||||
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_e_icon_cache_find(Evas_Object *obj, const char *file)
|
||||
{
|
||||
E_Smart_Data *sd;
|
||||
Cache_Item *ci;
|
||||
char buf[4096];
|
||||
const char *id;
|
||||
Eina_List *l;
|
||||
|
||||
if (!_cache) return EINA_FALSE;
|
||||
|
||||
if (!(sd = evas_object_smart_data_get(obj)))
|
||||
return EINA_FALSE;
|
||||
|
||||
snprintf(buf, sizeof(buf), "%d:%s", sd->size, file);
|
||||
|
||||
if ((ci = eina_hash_find(_cache->hash, buf)))
|
||||
{
|
||||
unsigned int w, h, alpha;
|
||||
void *data;
|
||||
int found = 0;
|
||||
|
||||
// XXX: make this async - in fact shouldnt we just point evas
|
||||
// XXX: to the cache eet file and key directly and have IT do the
|
||||
// XXX: loading as it can and can thus share?
|
||||
if (!_cache->ef)
|
||||
_cache->ef = eet_open(_cache->file, EET_FILE_MODE_READ_WRITE);
|
||||
|
||||
if (_cache->ef && (data = eet_data_image_read(_cache->ef, buf,
|
||||
&w, &h, &alpha,
|
||||
NULL, NULL, NULL)))
|
||||
{
|
||||
evas_object_image_size_set(sd->obj, w, h);
|
||||
evas_object_image_alpha_set(sd->obj, alpha);
|
||||
evas_object_image_data_copy_set(sd->obj, data);
|
||||
evas_object_smart_callback_call(obj, "preloaded", NULL);
|
||||
if (!sd->invalid) evas_object_show(sd->obj);
|
||||
free(data);
|
||||
found = 1;
|
||||
}
|
||||
|
||||
if ((_cache->ef) && !(_cache->timer))
|
||||
_cache->timer = ecore_timer_add(3.0, _e_icon_cache_save, NULL);
|
||||
|
||||
if (found)
|
||||
return EINA_TRUE;
|
||||
|
||||
eina_hash_del_by_key(_cache->hash, ci->id);
|
||||
ci = NULL;
|
||||
}
|
||||
|
||||
id = eina_stringshare_add(buf);
|
||||
|
||||
/* not found in cache, check load queue */
|
||||
EINA_LIST_FOREACH(_cache->load_queue, l, ci)
|
||||
{
|
||||
if (ci->id != id) continue;
|
||||
ci->objs = eina_list_append(ci->objs, obj);
|
||||
sd->ci = ci;
|
||||
evas_object_event_callback_add(sd->obj, EVAS_CALLBACK_DEL,
|
||||
_e_icon_obj_del, obj);
|
||||
eina_stringshare_del(id);
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
ci = E_NEW(Cache_Item, 1);
|
||||
ci->id = id;
|
||||
ci->icon = sd->obj;
|
||||
ci->obj = obj;
|
||||
sd->ci = ci;
|
||||
sd->file = eina_stringshare_add(file);
|
||||
|
||||
evas_object_event_callback_add(sd->obj, EVAS_CALLBACK_DEL, _e_icon_obj_del, obj);
|
||||
|
||||
_cache->load_queue = eina_list_append(_cache->load_queue, ci);
|
||||
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
_e_icon_cache_icon_try_next(Cache_Item *ci)
|
||||
{
|
||||
Evas_Object *obj;
|
||||
E_Smart_Data *sd;
|
||||
|
||||
if (!ci->objs)
|
||||
{
|
||||
/* no more e_icon wait for this object to be loaded */
|
||||
_cache->load_queue = eina_list_remove(_cache->load_queue, ci);
|
||||
_e_icon_cache_item_free(ci);
|
||||
return;
|
||||
}
|
||||
|
||||
obj = eina_list_data_get(ci->objs);
|
||||
ci->objs = eina_list_remove_list(ci->objs, ci->objs);
|
||||
|
||||
if (!obj)
|
||||
goto __try_next;
|
||||
|
||||
if (!(sd = evas_object_smart_data_get(obj)))
|
||||
goto __try_next;
|
||||
|
||||
evas_object_image_file_set(sd->obj, sd->file, NULL);
|
||||
if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
|
||||
goto __try_next;
|
||||
|
||||
sd->ci->icon = sd->obj;
|
||||
sd->ci->obj = obj;
|
||||
evas_object_image_preload(sd->obj, EINA_FALSE);
|
||||
return;
|
||||
|
||||
__try_next:
|
||||
evas_object_event_callback_del_full(sd->obj, EVAS_CALLBACK_DEL,
|
||||
_e_icon_obj_del, obj);
|
||||
_e_icon_cache_icon_try_next(ci);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_icon_obj_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
|
||||
{
|
||||
E_Smart_Data *sd;
|
||||
|
||||
if (!(sd = evas_object_smart_data_get(data))) return;
|
||||
if (!sd->ci) return;
|
||||
|
||||
/* check if the deleted object is the one that is used for
|
||||
preloading. when other objs wait for this image data start
|
||||
preloading again with the next. */
|
||||
|
||||
if (sd->ci->icon == obj)
|
||||
{
|
||||
_e_icon_cache_icon_try_next(sd->ci);
|
||||
sd->ci = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
sd->ci->objs = eina_list_remove(sd->ci->objs, data);
|
||||
sd->ci = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_e_icon_cache_icon_loaded(Cache_Item *ci)
|
||||
{
|
||||
int w, h, alpha;
|
||||
E_Smart_Data *sd;
|
||||
Evas_Object *obj;
|
||||
void *data;
|
||||
|
||||
if (!_cache) return;
|
||||
|
||||
if (!ci || !ci->id) return;
|
||||
_cache->load_queue = eina_list_remove(_cache->load_queue, ci);
|
||||
|
||||
// XXX: making copies of icon data here is not a good idea - fix this
|
||||
// XXX: the whole point of efl is to NOT do this and to share srcs
|
||||
// XXX: so probably refer to the original eet src file if its a
|
||||
// XXX: cached icon
|
||||
data = evas_object_image_data_get(ci->icon, EINA_FALSE);
|
||||
evas_object_image_size_get(ci->icon, &w, &h);
|
||||
alpha = evas_object_image_alpha_get(ci->icon);
|
||||
|
||||
evas_object_event_callback_del_full(ci->icon, EVAS_CALLBACK_DEL,
|
||||
_e_icon_obj_del, ci->obj);
|
||||
evas_object_smart_callback_call(ci->obj, "preloaded", NULL);
|
||||
|
||||
DBG("icon loaded %p, %s\n", data, ci->id);
|
||||
|
||||
sd = evas_object_smart_data_get(ci->obj);
|
||||
sd->ci = NULL;
|
||||
|
||||
/* pass loaded data to other e_icon wating for this */
|
||||
EINA_LIST_FREE(ci->objs, obj)
|
||||
{
|
||||
sd = evas_object_smart_data_get(obj);
|
||||
sd->ci = NULL;
|
||||
evas_object_event_callback_del_full(sd->obj, EVAS_CALLBACK_DEL,
|
||||
_e_icon_obj_del, obj);
|
||||
if (!data) continue;
|
||||
|
||||
evas_object_image_size_set(sd->obj, w, h);
|
||||
evas_object_image_alpha_set(sd->obj, alpha);
|
||||
evas_object_image_data_copy_set(sd->obj, data);
|
||||
if (!sd->invalid) evas_object_show(sd->obj);
|
||||
evas_object_smart_callback_call(obj, "preloaded", NULL);
|
||||
}
|
||||
|
||||
if (data)
|
||||
{
|
||||
if (!_cache->ef)
|
||||
_cache->ef = eet_open(_cache->file, EET_FILE_MODE_READ_WRITE);
|
||||
if (_cache->ef && eet_data_image_write(_cache->ef, ci->id, data,
|
||||
w, h, alpha, 1, 100, 0))
|
||||
{
|
||||
eina_hash_add(_cache->hash, ci->id, ci);
|
||||
eet_data_write(_cache->ef, cache_edd, "idx", _cache, 1);
|
||||
|
||||
if (!_cache->timer)
|
||||
_cache->timer = ecore_timer_add(3.0, _e_icon_cache_save, NULL);
|
||||
|
||||
eina_stringshare_replace(&ci->id, NULL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DBG("couldnt write cache %p !!!\n", _cache->ef);
|
||||
_e_icon_cache_item_free(ci);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue