From 1ba2fd77a05874ef51205b45d560eddc534e7dd8 Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Fri, 5 Nov 2010 13:11:31 +0000 Subject: [PATCH] Set fdo icon directly in e_icon This makes it simple to find the right icon size for current view size SVN revision: 54177 --- src/bin/e_icon.c | 74 +++++++++++++++++++++++++++++++++++ src/bin/e_icon.h | 1 + src/modules/ibar/e_mod_main.c | 17 ++------ 3 files changed, 79 insertions(+), 13 deletions(-) diff --git a/src/bin/e_icon.c b/src/bin/e_icon.c index eb81d5e6b..a5215bcd8 100644 --- a/src/bin/e_icon.c +++ b/src/bin/e_icon.c @@ -8,6 +8,7 @@ struct _E_Smart_Data Evas_Object *obj; Evas_Object *eventarea; int size; + const char *fdo; unsigned char fill_inside : 1; unsigned char scale_up : 1; unsigned char preload : 1; @@ -67,6 +68,11 @@ e_icon_file_set(Evas_Object *obj, const char *file) _e_icon_obj_prepare(obj, sd); /* FIXME: 64x64 - unhappy about this. use icon size */ sd->loading = 0; + if (sd->fdo) + { + eina_stringshare_del(sd->fdo); + sd->fdo = NULL; + } if (sd->size != 0) evas_object_image_load_size_set(sd->obj, sd->size, sd->size); if (sd->preload) evas_object_hide(sd->obj); @@ -94,6 +100,11 @@ e_icon_file_key_set(Evas_Object *obj, const char *file, const char *key) /* smart code here */ sd->loading = 0; + if (sd->fdo) + { + eina_stringshare_del(sd->fdo); + sd->fdo = NULL; + } _e_icon_obj_prepare(obj, sd); if (sd->size != 0) evas_object_image_load_size_set(sd->obj, sd->size, sd->size); @@ -123,6 +134,11 @@ e_icon_file_edje_set(Evas_Object *obj, const char *file, const char *part) /* smart code here */ if (sd->obj) evas_object_del(sd->obj); sd->loading = 0; + if (sd->fdo) + { + eina_stringshare_del(sd->fdo); + sd->fdo = NULL; + } sd->obj = edje_object_add(evas_object_evas_get(obj)); edje_object_file_set(sd->obj, file, part); if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE) @@ -133,6 +149,44 @@ e_icon_file_edje_set(Evas_Object *obj, const char *file, const char *part) return EINA_TRUE; } +EAPI Eina_Bool +e_icon_fdo_icon_set(Evas_Object *obj, const char *icon) +{ + E_Smart_Data *sd; + char *path; + + if (!icon) return EINA_TRUE; + if (icon[0] == '/') return e_icon_file_set(obj, icon); + + if (!(sd = evas_object_smart_data_get(obj))) + return EINA_FALSE; + + eina_stringshare_replace(&sd->fdo, icon); + if (!sd->fdo) return EINA_FALSE; + path = efreet_icon_path_find(e_config->icon_theme, sd->fdo, sd->size); + if (!path) return EINA_TRUE; + + /* smart code here */ + _e_icon_obj_prepare(obj, sd); + sd->loading = 0; + if (sd->size != 0) + evas_object_image_load_size_set(sd->obj, sd->size, sd->size); + if (sd->preload) evas_object_hide(sd->obj); + evas_object_image_file_set(sd->obj, path, NULL); + free(path); + if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE) + return EINA_FALSE; + if (sd->preload) + { + sd->loading = 1; + evas_object_image_preload(sd->obj, 0); + } + else if (evas_object_visible_get(obj)) + evas_object_show(sd->obj); + _e_icon_smart_reconfigure(sd); + return EINA_TRUE; +} + EAPI void e_icon_object_set(Evas_Object *obj, Evas_Object *o) { @@ -466,6 +520,7 @@ _e_icon_smart_del(Evas_Object *obj) if (!(sd = evas_object_smart_data_get(obj))) return; evas_object_del(sd->obj); evas_object_del(sd->eventarea); + if (sd->fdo) eina_stringshare_del(sd->fdo); free(sd); } @@ -490,6 +545,25 @@ _e_icon_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) if ((sd->w == w) && (sd->h == h)) return; sd->w = w; sd->h = h; + if (sd->fdo) + { + char *path; + + sd->size = MAX(w, h); + path = efreet_icon_path_find(e_config->icon_theme, sd->fdo, sd->size); + if (!path) return; + + /* smart code here */ + evas_object_image_load_size_set(sd->obj, sd->size, sd->size); + evas_object_image_file_set(sd->obj, path, NULL); + free(path); + if (sd->preload) + { + sd->loading = 1; + evas_object_image_preload(sd->obj, 0); + } + } + _e_icon_smart_reconfigure(sd); } diff --git a/src/bin/e_icon.h b/src/bin/e_icon.h index 7d0b7afd1..4491a1325 100644 --- a/src/bin/e_icon.h +++ b/src/bin/e_icon.h @@ -7,6 +7,7 @@ EAPI Evas_Object *e_icon_add (Evas *evas); EAPI Eina_Bool e_icon_file_set (Evas_Object *obj, const char *file); EAPI Eina_Bool e_icon_file_key_set (Evas_Object *obj, const char *file, const char *key); EAPI Eina_Bool e_icon_file_edje_set (Evas_Object *obj, const char *file, const char *part); +EAPI Eina_Bool e_icon_fdo_icon_set (Evas_Object *obj, const char *icon); EAPI void e_icon_object_set (Evas_Object *obj, Evas_Object *o); EAPI const char *e_icon_file_get (const Evas_Object *obj); EAPI void e_icon_smooth_scale_set (Evas_Object *obj, Eina_Bool smooth); diff --git a/src/modules/ibar/e_mod_main.c b/src/modules/ibar/e_mod_main.c index 231934a75..90d5334c3 100644 --- a/src/modules/ibar/e_mod_main.c +++ b/src/modules/ibar/e_mod_main.c @@ -413,15 +413,6 @@ _ibar_resize_handle(IBar *b) e_box_freeze(b->o_box); EINA_LIST_FOREACH(b->icons, l, ic) { - if ((w > 0) && (h > 0)) - { - int size; - - size = MAX(w, h); - /* TODO: Check icon padding */ - if (ic->o_icon) e_util_desktop_icon_file_set(ic->o_icon, ic->app, size); - if (ic->o_icon2) e_util_desktop_icon_file_set(ic->o_icon2, ic->app, size); - } e_box_pack_options_set(ic->o_holder, 1, 1, /* fill */ 0, 0, /* expand */ @@ -599,14 +590,14 @@ static void _ibar_icon_fill(IBar_Icon *ic) { if (ic->o_icon) evas_object_del(ic->o_icon); - ic->o_icon = e_util_desktop_icon_add(ic->app, 48, - evas_object_evas_get(ic->ibar->o_box)); + ic->o_icon = e_icon_add(evas_object_evas_get(ic->ibar->o_box)); + e_icon_fdo_icon_set(ic->o_icon, ic->app->icon); edje_object_part_swallow(ic->o_holder, "e.swallow.content", ic->o_icon); evas_object_pass_events_set(ic->o_icon, 1); evas_object_show(ic->o_icon); if (ic->o_icon2) evas_object_del(ic->o_icon2); - ic->o_icon2 = e_util_desktop_icon_add(ic->app, 48, - evas_object_evas_get(ic->ibar->o_box)); + ic->o_icon2 = e_icon_add(evas_object_evas_get(ic->ibar->o_box)); + e_icon_fdo_icon_set(ic->o_icon2, ic->app->icon); edje_object_part_swallow(ic->o_holder2, "e.swallow.content", ic->o_icon2); evas_object_pass_events_set(ic->o_icon2, 1); evas_object_show(ic->o_icon2);