e icon - use new skip header async preload to make icon loads async

now they can be trule async hopefully stopping things like application
menu from stalling while loading icons header... which is really nasty
with svg's. this actually makes icons async by default which is really
EXACTLY what you want. this also prepares for later making edje loads
async.

@feature
devs/bu5hm4n/mixer_fix_range
Carsten Haitzler 6 years ago
parent 227d49e346
commit 3779086a63
  1. 6
      src/bin/e_dialog.c
  2. 4
      src/bin/e_fm.c
  3. 187
      src/bin/e_icon.c
  4. 2
      src/bin/e_icon.h
  5. 3
      src/bin/e_utils.c
  6. 9
      src/bin/e_widget_image.c
  7. 1
      src/bin/e_xkb.c
  8. 6
      src/modules/conf_display/e_int_config_desklock.c
  9. 14
      src/modules/conf_theme/e_int_config_xsettings.c
  10. 6
      src/modules/everything/evry_util.c
  11. 4
      src/modules/ibar/e_mod_main.c
  12. 4
      src/modules/ibox/e_mod_main.c
  13. 11
      src/modules/notification/e_mod_popup.c
  14. 6
      src/modules/systray/e_mod_notifier_host.c
  15. 2
      src/modules/tasks/e_mod_main.c
  16. 6
      src/modules/winlist/e_winlist.c

@ -176,11 +176,7 @@ e_dialog_icon_set(E_Dialog *dia, const char *icon, Evas_Coord size)
evas_object_show(dia->icon_object);
}
if (!e_util_icon_theme_set(dia->icon_object, icon))
if (!e_icon_file_edje_set(dia->icon_object, icon, "icon"))
{
E_FREE_FUNC(dia->icon_object, evas_object_del);
return;
}
e_icon_file_edje_set(dia->icon_object, icon, "icon");
evas_object_size_hint_min_set(dia->icon_object, size * e_scale, size * e_scale);
elm_layout_signal_emit(dia->bg_object, "e,state,icon", "e");
elm_layout_signal_emit(dia->bg_object, "e,icon,enabled", "e");

@ -11517,9 +11517,9 @@ _update_volume_icon(E_Volume *v, E_Fm2_Icon *ic)
if (e)
{
if (ic->info.removable_full)
edje_object_signal_emit(e, "e,state,removable,full", "e");
e_icon_edje_emit(ic->obj_icon, "e,state,removable,full", "e");
else
edje_object_signal_emit(e, "e,state,removable,empty", "e");
e_icon_edje_emit(ic->obj_icon, "e,state,removable,empty", "e");
}
if (v)

@ -217,20 +217,22 @@ _handle_anim(E_Smart_Data *sd)
return 1;
}
E_API Eina_Bool
E_API void
e_icon_file_set(Evas_Object *obj, const char *file)
{
E_Smart_Data *sd;
int len;
if (!file) return EINA_FALSE;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR(0);
if (!(sd = evas_object_smart_data_get(obj)))
return EINA_FALSE;
if (!file) return;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR();
if (!(sd = evas_object_smart_data_get(obj))) return;
len = strlen(file);
if ((len > 4) && (!strcasecmp(file + len - 4, ".edj")))
return e_icon_file_edje_set(obj, file, "icon");
{
e_icon_file_edje_set(obj, file, "icon");
return;
}
/* smart code here */
_e_icon_obj_prepare(obj, sd);
@ -258,13 +260,15 @@ e_icon_file_set(Evas_Object *obj, const char *file)
if (_e_icon_cache_find(obj, file))
{
_e_icon_smart_reconfigure(sd);
return EINA_TRUE;
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);
if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
return EINA_FALSE;
// if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
// return EINA_FALSE;
if (!_handle_anim(sd))
{
@ -294,17 +298,15 @@ e_icon_file_set(Evas_Object *obj, const char *file)
#endif
_e_icon_smart_reconfigure(sd);
return EINA_TRUE;
}
E_API Eina_Bool
E_API void
e_icon_file_key_set(Evas_Object *obj, const char *file, const char *key)
{
E_Smart_Data *sd;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR(0);
if (!(sd = evas_object_smart_data_get(obj)))
return EINA_FALSE;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR();
if (!(sd = evas_object_smart_data_get(obj))) return;
/* smart code here */
sd->loading = 0;
@ -327,8 +329,8 @@ e_icon_file_key_set(Evas_Object *obj, const char *file, const char *key)
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, file, key);
if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
return EINA_FALSE;
// if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
// return EINA_FALSE;
if (!_handle_anim(sd))
{
if (sd->preload)
@ -340,7 +342,6 @@ e_icon_file_key_set(Evas_Object *obj, const char *file, const char *key)
evas_object_show(sd->obj);
}
_e_icon_smart_reconfigure(sd);
return EINA_TRUE;
}
E_API void
@ -385,14 +386,13 @@ e_icon_edje_get(Evas_Object *obj)
return sd->edje ? sd->obj : NULL;
}
E_API Eina_Bool
E_API void
e_icon_file_edje_set(Evas_Object *obj, const char *file, const char *part)
{
E_Smart_Data *sd;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR(0);
if (!(sd = evas_object_smart_data_get(obj)))
return EINA_FALSE;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR();
if (!(sd = evas_object_smart_data_get(obj))) return;
/* smart code here */
if (sd->obj) evas_object_del(sd->obj);
@ -413,27 +413,29 @@ e_icon_file_edje_set(Evas_Object *obj, const char *file, const char *part)
sd->obj = edje_object_add(evas_object_evas_get(obj));
edje_object_file_set(sd->obj, file, part);
if (edje_object_load_error_get(sd->obj) != EDJE_LOAD_ERROR_NONE)
return EINA_FALSE;
// if (edje_object_load_error_get(sd->obj) != EDJE_LOAD_ERROR_NONE)
// return EINA_FALSE;
if (evas_object_visible_get(obj)) evas_object_show(sd->obj);
evas_object_smart_member_add(sd->obj, obj);
_e_icon_smart_reconfigure(sd);
return EINA_TRUE;
}
E_API Eina_Bool
E_API void
e_icon_fdo_icon_set(Evas_Object *obj, const char *icon)
{
E_Smart_Data *sd;
const char *path;
int len;
if (!icon) return EINA_FALSE;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR(0);
if (icon[0] == '/') return e_icon_file_set(obj, icon);
if (!icon) return;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR();
if (icon[0] == '/')
{
e_icon_file_set(obj, icon);
return;
}
if (!(sd = evas_object_smart_data_get(obj)))
return EINA_FALSE;
if (!(sd = evas_object_smart_data_get(obj))) return;
if (sd->timer) ecore_timer_del(sd->timer);
sd->timer = NULL;
@ -444,19 +446,22 @@ e_icon_fdo_icon_set(Evas_Object *obj, const char *icon)
sd->edje = EINA_FALSE;
eina_stringshare_replace(&sd->fdo, icon);
if (!sd->fdo) return EINA_FALSE;
if (!sd->fdo) return;
path = efreet_icon_path_find(e_config->icon_theme, sd->fdo, sd->size);
if (!path)
{
if (e_util_strcmp(e_config->icon_theme, "hicolor"))
path = efreet_icon_path_find("hicolor", sd->fdo, sd->size);
if (!path) return EINA_FALSE;
if (!path) return;
}
len = strlen(icon);
if ((len > 4) && (!strcasecmp(icon + len - 4, ".edj")))
return e_icon_file_edje_set(obj, path, "icon");
{
e_icon_file_edje_set(obj, path, "icon");
return;
}
/* smart code here */
_e_icon_obj_prepare(obj, sd);
@ -465,8 +470,8 @@ e_icon_fdo_icon_set(Evas_Object *obj, const char *icon)
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);
if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
return EINA_FALSE;
// if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
// return EINA_FALSE;
if (sd->preload)
{
sd->loading = 1;
@ -475,7 +480,7 @@ e_icon_fdo_icon_set(Evas_Object *obj, const char *icon)
else if (evas_object_visible_get(obj))
evas_object_show(sd->obj);
_e_icon_smart_reconfigure(sd);
return EINA_TRUE;
return;
}
E_API void
@ -723,6 +728,16 @@ e_icon_selected_set(const Evas_Object *obj, Eina_Bool selected)
edje_object_signal_emit(sd->obj, "e,state,unselected", "e");
}
E_API void
e_icon_edje_emit(const Evas_Object *obj, const char *sig, const char *src)
{
E_Smart_Data *sd;
if (evas_object_smart_smart_get(obj) != _e_smart) SMARTERR();
if (!(sd = evas_object_smart_data_get(obj))) return;
edje_object_signal_emit(sd->obj, sig, src);
}
/* local subsystem globals */
static void
_e_icon_smart_reconfigure(E_Smart_Data *sd)
@ -731,61 +746,62 @@ _e_icon_smart_reconfigure(E_Smart_Data *sd)
Evas_Coord x, y, w, h;
if (!sd->obj) return;
if (sd->edje)
w = sd->w;
h = sd->h;
x = sd->x;
y = sd->y;
if (!sd->loading)
{
w = sd->w;
h = sd->h;
x = sd->x;
y = sd->y;
evas_object_move(sd->obj, x, y);
evas_object_resize(sd->obj, w, h);
evas_object_move(sd->eventarea, x, y);
evas_object_resize(sd->eventarea, w, h);
}
else
{
iw = 0;
ih = 0;
evas_object_image_size_get(sd->obj, &iw, &ih);
if (iw < 1) iw = 1;
if (ih < 1) ih = 1;
if (sd->fill_inside)
if (sd->edje)
{
w = sd->w;
h = ((double)ih * w) / (double)iw;
if (h > sd->h)
{
h = sd->h;
w = ((double)iw * h) / (double)ih;
}
evas_object_move(sd->obj, x, y);
evas_object_resize(sd->obj, w, h);
}
else
{
w = sd->w;
h = ((double)ih * w) / (double)iw;
if (h < sd->h)
iw = 0;
ih = 0;
evas_object_image_size_get(sd->obj, &iw, &ih);
if (iw < 1) iw = 1;
if (ih < 1) ih = 1;
if (sd->fill_inside)
{
h = sd->h;
w = ((double)iw * h) / (double)ih;
w = sd->w;
h = ((double)ih * w) / (double)iw;
if (h > sd->h)
{
h = sd->h;
w = ((double)iw * h) / (double)ih;
}
}
}
if (!sd->scale_up)
{
if ((w > iw) || (h > ih))
else
{
w = iw;
h = ih;
w = sd->w;
h = ((double)ih * w) / (double)iw;
if (h < sd->h)
{
h = sd->h;
w = ((double)iw * h) / (double)ih;
}
}
if (!sd->scale_up)
{
if ((w > iw) || (h > ih))
{
w = iw;
h = ih;
}
}
x = sd->x + ((sd->w - w) / 2);
y = sd->y + ((sd->h - h) / 2);
evas_object_move(sd->obj, x, y);
evas_object_image_fill_set(sd->obj, 0, 0, w, h);
evas_object_resize(sd->obj, w, h);
}
x = sd->x + ((sd->w - w) / 2);
y = sd->y + ((sd->h - h) / 2);
evas_object_move(sd->obj, x, y);
evas_object_image_fill_set(sd->obj, 0, 0, w, h);
evas_object_resize(sd->obj, w, h);
evas_object_move(sd->eventarea, x, y);
evas_object_resize(sd->eventarea, w, h);
}
evas_object_move(sd->eventarea, x, y);
evas_object_resize(sd->eventarea, w, h);
}
static void
@ -820,7 +836,7 @@ _e_icon_preloaded(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
evas_object_smart_callback_call(data, "preloaded", NULL);
evas_object_show(sd->obj);
sd->loading = 0;
_e_icon_smart_reconfigure(sd);
#ifdef USE_ICON_CACHE
_e_icon_cache_icon_loaded(sd->ci);
#endif
@ -832,13 +848,15 @@ _e_icon_smart_add(Evas_Object *obj)
E_Smart_Data *sd;
if (!(sd = calloc(1, sizeof(E_Smart_Data)))) return;
sd->eventarea = evas_object_rectangle_add(evas_object_evas_get(obj));
evas_object_color_set(sd->eventarea, 0, 0, 0, 0);
evas_object_smart_member_add(sd->eventarea, obj);
sd->obj = evas_object_image_add(evas_object_evas_get(obj));
evas_object_event_callback_add(sd->obj, EVAS_CALLBACK_IMAGE_PRELOADED,
_e_icon_preloaded, obj);
sd->eventarea = evas_object_rectangle_add(evas_object_evas_get(obj));
evas_object_color_set(sd->eventarea, 0, 0, 0, 0);
evas_object_smart_member_add(sd->eventarea, obj);
sd->x = 0;
sd->y = 0;
sd->w = 0;
@ -846,6 +864,7 @@ _e_icon_smart_add(Evas_Object *obj)
sd->fill_inside = 1;
sd->scale_up = 1;
sd->size = 64;
sd->preload = 0;
evas_object_smart_member_add(sd->obj, obj);
evas_object_smart_data_set(obj, sd);
}

@ -31,6 +31,6 @@ E_API void *e_icon_data_get (const Evas_Object *obj, int *w, int
E_API void e_icon_scale_size_set (Evas_Object *obj, int size);
E_API int e_icon_scale_size_get (const Evas_Object *obj);
E_API void e_icon_selected_set (const Evas_Object *obj, Eina_Bool selected);
E_API void e_icon_edje_emit (const Evas_Object *obj, const char *sig, const char *src);
#endif
#endif

@ -224,7 +224,8 @@ e_util_icon_theme_set(Evas_Object *obj, const char *icon)
{
if (icon && (icon[0] == '/'))
{
if (e_icon_file_set(obj, icon)) return 1;
e_icon_file_set(obj, icon);
return 1;
}
if (e_config->icon_theme_overrides)
{

@ -49,19 +49,14 @@ e_widget_image_add_from_file(Evas *evas, const char *file, int minw, int minh)
Evas_Object *obj, *o;
E_Widget_Data *wd;
if (!ecore_file_exists(file)) return NULL;
obj = e_widget_add(evas);
wd = calloc(1, sizeof(E_Widget_Data));
if (!wd) return NULL;
o = e_icon_add(evas);
e_icon_fill_inside_set(o, 1);
if (!e_icon_file_set(o, file))
{
evas_object_del(o);
free(wd);
evas_object_del(obj);
return NULL;
}
e_icon_file_set(o, file);
wd->img = o;
evas_object_show(o);

@ -459,6 +459,7 @@ e_xkb_e_icon_flag_setup(Evas_Object *eicon, const char *name)
char buf[PATH_MAX];
e_xkb_flag_file_get(buf, sizeof(buf), name);
e_icon_preload_set(eicon, EINA_FALSE);
e_icon_file_set(eicon, buf);
e_icon_size_get(eicon, &w, &h);
edje_extern_object_aspect_set(eicon, EDJE_ASPECT_CONTROL_BOTH, w, h);

@ -316,11 +316,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
}
e_xkb_flag_file_get(buf, sizeof(buf), name);
icon = e_icon_add(evas);
if (!e_icon_file_set(icon, buf))
{
evas_object_del(icon);
icon = NULL;
}
e_icon_file_set(icon, buf);
if (cl->variant)
snprintf(buf, sizeof(buf), "%s (%s, %s)", cl->name, cl->model, cl->variant);
else

@ -336,14 +336,8 @@ _icon_new(Evas *evas, const char *theme, const char *icon, unsigned int size)
if (!(path = efreet_icon_path_find(theme, icon, size))) return NULL;
o = e_icon_add(evas);
if (e_icon_file_set(o, path))
e_icon_fill_inside_set(o, 1);
else
{
evas_object_del(o);
o = NULL;
}
e_icon_file_set(o, path);
e_icon_fill_inside_set(o, EINA_TRUE);
return o;
}
@ -359,8 +353,8 @@ _populate_icon_preview(E_Config_Dialog_Data *cfdata)
if (!(path = efreet_icon_path_find(t, _icon_previews[i], PREVIEW_SIZE)))
continue;
if (e_icon_file_set(cfdata->gui.icon_preview[i], path))
e_icon_fill_inside_set(cfdata->gui.icon_preview[i], EINA_TRUE);
e_icon_file_set(cfdata->gui.icon_preview[i], path);
e_icon_fill_inside_set(cfdata->gui.icon_preview[i], EINA_TRUE);
}
}

@ -441,11 +441,7 @@ evry_icon_theme_get(const char *icon, Evas *e)
if (icon[0] == '/')
{
if (!e_icon_file_set(o, icon))
{
evas_object_del(o);
o = NULL;
}
e_icon_file_set(o, icon);
}
else if (!e_util_icon_theme_set(o, icon))
{

@ -972,11 +972,11 @@ _ibar_icon_signal_emit(IBar_Icon *ic, const char *sig, const char *src)
if (ic->o_holder)
edje_object_signal_emit(ic->o_holder, sig, src);
if (ic->o_icon && e_icon_edje_get(ic->o_icon))
edje_object_signal_emit(e_icon_edje_get(ic->o_icon), sig, src);
e_icon_edje_emit(ic->o_icon, sig, src);
if (ic->o_holder2)
edje_object_signal_emit(ic->o_holder2, sig, src);
if (ic->o_icon2 && e_icon_edje_get(ic->o_icon2))
edje_object_signal_emit(e_icon_edje_get(ic->o_icon2), sig, src);
e_icon_edje_emit(ic->o_icon2, sig, src);
}
static void

@ -635,11 +635,11 @@ _ibox_icon_signal_emit(IBox_Icon *ic, char *sig, char *src)
if (ic->o_holder)
edje_object_signal_emit(ic->o_holder, sig, src);
if (ic->o_icon && e_icon_edje_get(ic->o_icon))
edje_object_signal_emit(e_icon_edje_get(ic->o_icon), sig, src);
e_icon_edje_emit(ic->o_icon, sig, src);
if (ic->o_holder2)
edje_object_signal_emit(ic->o_holder2, sig, src);
if (ic->o_icon2 && e_icon_edje_get(ic->o_icon2))
edje_object_signal_emit(e_icon_edje_get(ic->o_icon2), sig, src);
e_icon_edje_emit(ic->o_icon2, sig, src);
}
static Eina_List *

@ -470,12 +470,11 @@ _notification_popup_refresh(Popup_Data *popup)
if (!popup->app_icon)
{
popup->app_icon = e_icon_add(popup->e);
if (!e_icon_file_set(popup->app_icon, uri ? uri->path : icon_path))
{
evas_object_del(popup->app_icon);
popup->app_icon = NULL;
}
else e_icon_size_get(popup->app_icon, &w, &h);
e_icon_file_set(popup->app_icon, uri ? uri->path : icon_path);
// XXX: FIXME: this disallows for async to work
// e_icon_size_get(popup->app_icon, &w, &h);
w = width;
h = height;
}
efreet_uri_free(uri);
}

@ -93,7 +93,11 @@ image_load(const char *name, const char *path, uint32_t *imgdata, int w, int h,
for (ext = exts; *ext; ext++)
{
snprintf(buf, sizeof(buf), "%s/%s/%ux%u/apps/%s%s", path, *theme, *i, *i, name, *ext);
if (e_icon_file_set(image, buf)) return;
if (ecore_file_exists(buf))
{
e_icon_file_set(image, buf);
return;
}
}
}
}

@ -723,7 +723,7 @@ _tasks_item_signal_emit(Tasks_Item *item, char *sig, char *src)
{
if (item->o_item) edje_object_signal_emit(item->o_item, sig, src);
if (item->o_icon && e_icon_edje_get(item->o_icon))
edje_object_signal_emit(e_icon_edje_get(item->o_icon), sig, src);
e_icon_edje_emit(item->o_icon, sig, src);
}
static Config_Item *

@ -773,8 +773,7 @@ _e_winlist_activate(void)
ww = _win_selected->data;
edje_object_signal_emit(ww->bg_object, "e,state,selected", "e");
if (ww->icon_object && e_icon_edje_get(ww->icon_object))
edje_object_signal_emit(e_icon_edje_get(ww->icon_object),
"e,state,selected", "e");
e_icon_edje_emit(ww->icon_object, "e,state,selected", "e");
if ((ww->client->iconic) &&
(e_config->winlist_list_uncover_while_selecting))
@ -868,8 +867,7 @@ _e_winlist_deactivate(void)
edje_object_part_text_set(_bg_object, "e.text.label", "");
edje_object_signal_emit(ww->bg_object, "e,state,unselected", "e");
if (ww->icon_object && e_icon_edje_get(ww->icon_object))
edje_object_signal_emit(e_icon_edje_get(ww->icon_object),
"e,state,unselected", "e");
e_icon_edje_emit(ww->icon_object, "e,state,unselected", "e");
if (!ww->client->lock_focus_in)
evas_object_focus_set(ww->client->frame, 0);
}

Loading…
Cancel
Save