billiob pushed a commit to branch master. http://git.enlightenment.org/apps/terminology.git/commit/?id=5c9d98cf22cf728f0f7dd759efc5c2f7e15460ce
commit 5c9d98cf22cf728f0f7dd759efc5c2f7e15460ce Author: Boris Faure <bill...@gmail.com> Date: Sun Aug 23 16:40:19 2015 +0200 add error handlers on textblocks. Should fix T2672 --- src/bin/media.c | 104 +++++++++++++++++++++++++++++++++++++------------------ src/bin/termio.c | 60 +++++++++++++++++++++++--------- 2 files changed, 114 insertions(+), 50 deletions(-) diff --git a/src/bin/media.c b/src/bin/media.c index dc04450..7cb4d6c 100644 --- a/src/bin/media.c +++ b/src/bin/media.c @@ -72,7 +72,7 @@ static Eina_Bool et_connected = EINA_FALSE; static Eina_List *et_queue = NULL; static void _et_init(void); -static void _type_thumb_init2(Evas_Object *obj); +static int _type_thumb_init2(Evas_Object *obj); static void _et_disconnect(void *data EINA_UNUSED, Ethumb_Client *c) @@ -187,11 +187,13 @@ _et_error(Ethumb_Client *c EINA_UNUSED, void *data) sd->et_req = NULL; } -static void +static int _type_thumb_init2(Evas_Object *obj) { Media *sd = evas_object_smart_data_get(obj); - if (!sd) return; + Eina_Bool ok; + + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, -1); if ((sd->realf) && (sd->realf[0] != '/')) { @@ -220,21 +222,31 @@ _type_thumb_init2(Evas_Object *obj) icon_theme = eina_stringshare_add(theme->name.internal); } fl = efreet_icon_path_find(icon_theme, sd->realf, sd->iw); - ethumb_client_file_set(et_client, fl, NULL); + ok = ethumb_client_file_set(et_client, fl, NULL); + if (!ok) + return -1; } else - ethumb_client_file_set(et_client, sd->realf, NULL); + { + ok = ethumb_client_file_set(et_client, sd->realf, NULL); + if (!ok) + return -1; + } + sd->et_req = ethumb_client_thumb_async_get(et_client, _et_done, _et_error, obj); sd->queued = EINA_FALSE; + return 0; } -static void +static int _type_thumb_init(Evas_Object *obj) { Evas_Object *o; Media *sd = evas_object_smart_data_get(obj); - if (!sd) return; + + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, -1); + sd->type = MEDIA_TYPE_THUMB; _et_init(); o = sd->o_img = evas_object_image_filled_add(evas_object_evas_get(obj)); @@ -248,9 +260,9 @@ _type_thumb_init(Evas_Object *obj) { et_queue = eina_list_append(et_queue, obj); sd->queued = EINA_TRUE; - return; + return 0; } - _type_thumb_init2(obj); + return _type_thumb_init2(obj); } //////////////////////// img @@ -299,26 +311,35 @@ _cb_img_frame(void *data) return EINA_TRUE; } -static void +static int _type_img_anim_handle(Evas_Object *obj) { double t; Media *sd = evas_object_smart_data_get(obj); - if (!sd) return; - if (!evas_object_image_animated_get(sd->o_img)) return; + + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, -1); + + if (!evas_object_image_animated_get(sd->o_img)) + return -1; + sd->fr = 1; sd->frnum = evas_object_image_animated_frame_count_get(sd->o_img); - if (sd->frnum < 2) return; + if (sd->frnum < 2) + return 0; + t = evas_object_image_animated_frame_duration_get(sd->o_img, sd->fr, 0); sd->anim = ecore_timer_add(t, _cb_img_frame, obj); + return 0; } -static void +static int _type_img_init(Evas_Object *obj) { Evas_Object *o; Media *sd = evas_object_smart_data_get(obj); - if (!sd) return; + + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, -1); + o = sd->o_img = evas_object_image_filled_add(evas_object_evas_get(obj)); evas_object_smart_member_add(o, obj); evas_object_clip_set(o, sd->clip); @@ -329,7 +350,7 @@ _type_img_init(Evas_Object *obj) evas_object_image_file_set(o, sd->realf, NULL); evas_object_image_size_get(o, &(sd->iw), &(sd->ih)); evas_object_image_preload(o, EINA_FALSE); - _type_img_anim_handle(obj); + return _type_img_anim_handle(obj); } static void @@ -408,12 +429,14 @@ _cb_scale_preloaded(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSE } } -static void +static int _type_scale_init(Evas_Object *obj) { Evas_Object *o; Media *sd = evas_object_smart_data_get(obj); - if (!sd) return; + + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, -1); + o = sd->o_img = evas_object_image_filled_add(evas_object_evas_get(obj)); evas_object_smart_member_add(o, obj); evas_object_clip_set(o, sd->clip); @@ -424,6 +447,8 @@ _type_scale_init(Evas_Object *obj) evas_object_image_file_set(o, sd->realf, NULL); evas_object_image_size_get(o, &(sd->iw), &(sd->ih)); evas_object_image_preload(o, EINA_FALSE); + + return 0; } static void @@ -516,7 +541,7 @@ _cb_edje_preloaded(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EIN evas_object_show(sd->clip); } -static void +static int _type_edje_init(Evas_Object *obj) { Evas_Object *o; @@ -528,7 +553,9 @@ _type_edje_init(Evas_Object *obj) NULL }; Media *sd = evas_object_smart_data_get(obj); - if (!sd) return; + + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, -1); + o = sd->o_img = edje_object_add(evas_object_evas_get(obj)); evas_object_smart_member_add(o, obj); evas_object_clip_set(o, sd->clip); @@ -541,9 +568,10 @@ _type_edje_init(Evas_Object *obj) _cb_edje_preloaded, obj); edje_object_preload(o, EINA_FALSE); theme_auto_reload_enable(o); - return; + return 0; } } + return 0; } static void @@ -696,7 +724,7 @@ _cb_media_pos(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EIN media_position_set(data, vx + vy); } -static void +static int _type_mov_init(Evas_Object *obj) { Evas_Object *o; @@ -710,9 +738,10 @@ _type_mov_init(Evas_Object *obj) "gstreamer1" }; char *mod = NULL; - Media *sd = evas_object_smart_data_get(obj); - if (!sd) return; + + EINA_SAFETY_ON_NULL_RETURN_VAL(sd, -1); + emotion_init(); o = sd->o_img = emotion_object_add(evas_object_evas_get(obj)); if ((sd->config->vidmod >= 0) && @@ -723,7 +752,7 @@ _type_mov_init(Evas_Object *obj) ERR(_("Could not Initialize the emotion module '%s'"), mod); evas_object_del(sd->o_img); sd->o_img = NULL; - return; + return -1; } evas_object_smart_callback_add(o, "frame_decode", _cb_mov_frame_decode, obj); @@ -769,8 +798,12 @@ _type_mov_init(Evas_Object *obj) evas_object_show(o); media_play_set(obj, EINA_TRUE); - if (sd->config->mute) media_mute_set(obj, EINA_TRUE); - if (sd->config->visualize) media_visualize_set(obj, EINA_TRUE); + if (sd->config->mute) + media_mute_set(obj, EINA_TRUE); + if (sd->config->visualize) + media_visualize_set(obj, EINA_TRUE); + + return 0; } static void @@ -1270,23 +1303,28 @@ media_add(Evas_Object *parent, const char *src, const Config *config, int mode, if ((mode & MEDIA_SIZE_MASK) == MEDIA_THUMB) { // XXX: handle sd->url being true? - _type_thumb_init(obj); + if (_type_thumb_init(obj) < 0) + goto err; } else { switch (type) { case MEDIA_TYPE_IMG: - if (!sd->url) _type_img_init(obj); + if (!sd->url && (_type_img_init(obj) < 0)) + goto err; break; case MEDIA_TYPE_SCALE: - if (!sd->url) _type_scale_init(obj); + if (!sd->url && (_type_scale_init(obj) < 0)) + goto err; break; case MEDIA_TYPE_EDJE: - if (!sd->url) _type_edje_init(obj); + if (!sd->url && (_type_edje_init(obj) < 0)) + goto err; break; case MEDIA_TYPE_MOV: - if (!sd->url) _type_mov_init(obj); + if (!sd->url && (_type_mov_init(obj) < 0)) + goto err; break; default: break; @@ -1306,12 +1344,10 @@ media_add(Evas_Object *parent, const char *src, const Config *config, int mode, return obj; -#if (ELM_VERSION_MAJOR == 1) && (ELM_VERSION_MINOR < 13) err: if (obj) evas_object_del(obj); return NULL; -#endif } void diff --git a/src/bin/termio.c b/src/bin/termio.c index 786cf3c..b879432 100644 --- a/src/bin/termio.c +++ b/src/bin/termio.c @@ -1774,12 +1774,16 @@ _block_edje_activate(Evas_Object *obj, Termblock *blk) if ((!blk->path) || (!blk->link)) return; blk->obj = edje_object_add(evas_object_evas_get(obj)); if (blk->path[0] == '/') - ok = edje_object_file_set(blk->obj, blk->path, blk->link); + { + ok = edje_object_file_set(blk->obj, blk->path, blk->link); + } else if (!strcmp(blk->path, "THEME")) - ok = edje_object_file_set(blk->obj, - config_theme_path_default_get - (sd->config), - blk->link); + { + ok = edje_object_file_set(blk->obj, + config_theme_path_default_get + (sd->config), + blk->link); + } else { char path[PATH_MAX], home[PATH_MAX]; @@ -1806,6 +1810,10 @@ _block_edje_activate(Evas_Object *obj, Termblock *blk) { _block_edje_cmds(sd->pty, blk, blk->cmds, EINA_TRUE); } + else + { + ERR("failed to activate textblock of id %d", blk->id); + } } static void @@ -1817,38 +1825,52 @@ _block_media_activate(Evas_Object *obj, Termblock *blk) Evas_Object *mctrl; EINA_SAFETY_ON_NULL_RETURN(sd); - if (blk->scale_stretch) media = MEDIA_STRETCH; - else if (blk->scale_center) media = MEDIA_POP; - else if (blk->scale_fill) media = MEDIA_BG; - else if (blk->thumb) media = MEDIA_THUMB; -// media = MEDIA_POP; + + if (blk->scale_stretch) + media = MEDIA_STRETCH; + else if (blk->scale_center) + media = MEDIA_POP; + else if (blk->scale_fill) + media = MEDIA_BG; + else if (blk->thumb) + media = MEDIA_THUMB; + if (!blk->was_active_before || blk->mov_state == MOVIE_STATE_STOP) media |= MEDIA_SAVE; else media |= MEDIA_RECOVER | MEDIA_SAVE; + type = media_src_type_get(blk->path); blk->obj = media_add(obj, blk->path, sd->config, media, type); + if (type == MEDIA_TYPE_MOV) media_play_set(blk->obj, blk->mov_state == MOVIE_STATE_PLAY); + evas_object_event_callback_add (blk->obj, EVAS_CALLBACK_DEL, _smart_media_del, blk); evas_object_smart_callback_add(blk->obj, "play", _smart_media_play, blk); evas_object_smart_callback_add(blk->obj, "pause", _smart_media_pause, blk); evas_object_smart_callback_add(blk->obj, "stop", _smart_media_stop, blk); + blk->type = type; evas_object_smart_member_add(blk->obj, obj); + mctrl = media_control_get(blk->obj); if (mctrl) { evas_object_smart_member_add(mctrl, obj); evas_object_stack_above(mctrl, sd->event); } + evas_object_stack_above(blk->obj, sd->grid.obj); evas_object_show(blk->obj); evas_object_data_set(blk->obj, "blk", blk); + if (blk->thumb) - evas_object_smart_callback_add - (blk->obj, "clicked", _smart_media_clicked, obj); + { + evas_object_smart_callback_add(blk->obj, "clicked", + _smart_media_clicked, obj); + } } static void @@ -1857,11 +1879,17 @@ _block_activate(Evas_Object *obj, Termblock *blk) Termio *sd = evas_object_smart_data_get(obj); EINA_SAFETY_ON_NULL_RETURN(sd); - if (blk->active) return; + + if (blk->active) + return; blk->active = EINA_TRUE; - if (blk->obj) return; - if (blk->edje) _block_edje_activate(obj, blk); - else _block_media_activate(obj, blk); + if (blk->obj) + return; + if (blk->edje) + _block_edje_activate(obj, blk); + else + _block_media_activate(obj, blk); + blk->was_active_before = EINA_TRUE; if (!blk->was_active) sd->pty->block.active = eina_list_append(sd->pty->block.active, blk); --