From 0e414444b201f66b8f8845e6f637243fbbe9fc2d Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 6 Sep 2012 18:26:09 +0000 Subject: [PATCH] add flag to gadcons to mark them as being custom gadcons, don't refresh custom gadcons completely when repopulating, fix crash which occurred when gadcon container was deleted before gadcon SVN revision: 76256 --- src/bin/e_gadcon.c | 40 ++++++++++++++++++++++++++++++++++++---- src/bin/e_gadcon.h | 1 + 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index 5c8721231..e4ca45004 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -366,6 +366,7 @@ e_gadcon_custom_new(E_Gadcon *gc) } if (!eina_list_data_find(custom_populate_requests, gc)) custom_populate_requests = eina_list_append(custom_populate_requests, gc); + gc->custom = EINA_TRUE; } EAPI void @@ -386,6 +387,7 @@ e_gadcon_custom_populate_request(E_Gadcon *gc) E_OBJECT_CHECK(gc); E_OBJECT_TYPE_CHECK(gc, E_GADCON_TYPE); + if (!gc->custom) return; if (!custom_populate_idler) { custom_populate_idler = @@ -927,6 +929,20 @@ e_gadcon_client_find(E_Gadcon *gc, E_Config_Gadcon_Client *cf_gcc) return NULL; } +static void +_e_gadcon_client_box_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + E_Gadcon_Client *gcc = data; + gcc->o_box = NULL; +} + +static void +_e_gadcon_client_frame_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + E_Gadcon_Client *gcc = data; + gcc->o_frame = NULL; +} + /** * Creates a new gadget * @@ -966,6 +982,7 @@ e_gadcon_client_new(E_Gadcon *gc, const char *name, const char *id __UNUSED__, c { edje_object_size_min_calc(gcc->o_frame, &(gcc->pad.w), &(gcc->pad.h)); gcc->o_box = e_box_add(gcc->gadcon->evas); + evas_object_event_callback_add(gcc->o_box, EVAS_CALLBACK_DEL, _e_gadcon_client_box_del, gcc); switch (gcc->gadcon->orient) { case E_GADCON_ORIENT_FLOAT: @@ -1015,7 +1032,10 @@ e_gadcon_client_new(E_Gadcon *gc, const char *name, const char *id __UNUSED__, c } } if (gcc->o_frame) - e_gadcon_layout_pack(gc->o_container, gcc->o_frame); + { + e_gadcon_layout_pack(gc->o_container, gcc->o_frame); + evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_DEL, _e_gadcon_client_frame_del, gcc); + } else if (gcc->o_base) e_gadcon_layout_pack(gc->o_container, gcc->o_base); if (gcc->o_base) evas_object_show(gcc->o_base); @@ -1948,7 +1968,7 @@ _e_gadcon_client_free(E_Gadcon_Client *gcc) if (gcc->o_box) evas_object_del(gcc->o_box); if (gcc->o_frame) evas_object_del(gcc->o_frame); eina_stringshare_del(gcc->name); - if (gcc->style) eina_stringshare_del(gcc->style); + eina_stringshare_del(gcc->style); free(gcc); } @@ -2704,6 +2724,7 @@ _e_gadcon_cb_drag_finished(E_Drag *drag, int dropped) { /* free client config */ e_gadcon_client_config_del(NULL, gcc->cf); + gcc->cf = NULL; /* delete the gadcon client */ /* TODO: Clean up module config too? */ e_object_del(E_OBJECT(gcc)); @@ -3105,8 +3126,13 @@ _e_gadcon_client_cb_menu_remove(void *data, E_Menu *m __UNUSED__, E_Menu_Item *m gc = gcc->gadcon; e_gadcon_client_config_del(gc->cf, gcc->cf); - e_gadcon_unpopulate(gc); - e_gadcon_populate(gc); + gcc->cf = NULL; + e_object_del(E_OBJECT(gcc)); + if (!gc->custom) + { + e_gadcon_unpopulate(gc); + e_gadcon_populate(gc); + } e_config_save_queue(); } @@ -3133,6 +3159,11 @@ _e_gadcon_client_del_hook(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNU gcc = data; gcc->o_base = NULL; + if (gcc->o_box) + { + evas_object_del(gcc->o_box); + gcc->o_box = NULL; + } if (gcc->o_frame) { evas_object_del(gcc->o_frame); @@ -3797,6 +3828,7 @@ _e_gadcon_layout_smart_del(Evas_Object *obj) } evas_object_del(sd->clip); free(sd); + evas_object_smart_data_set(obj, NULL); } static void diff --git a/src/bin/e_gadcon.h b/src/bin/e_gadcon.h index 1bac99814..4f7398c2e 100644 --- a/src/bin/e_gadcon.h +++ b/src/bin/e_gadcon.h @@ -133,6 +133,7 @@ struct _E_Gadcon unsigned char instant_edit : 1; unsigned char dummy : 1; + Eina_Bool custom : 1; }; #define GADCON_CLIENT_CLASS_VERSION 3