summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTae-Hwan Kim <the81.kim@samsung.com>2014-02-07 18:09:46 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2014-02-07 18:09:46 +0900
commite20875ffc315c68f17f51c49ec1f62fe1013de5b (patch)
tree5d5c8ddb28e149487bc2ec09aa6a7fdddde09708
parent428ff3f869a4ababdfe3cef09006d86b04d1d81f (diff)
[Widget] Prevent widget item API calls while item is deleting except data_get API call. The data by data_set is user_data. So it can be needed inside deleting function trace.
Reviewers: raster, cedric, Hermet, seoz Reviewed By: raster Differential Revision: https://phab.enlightenment.org/D525
-rw-r--r--src/lib/elm_widget.c67
-rw-r--r--src/lib/elm_widget.h18
2 files changed, 85 insertions, 0 deletions
diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c
index 1cba17bb2..4cb6010b6 100644
--- a/src/lib/elm_widget.c
+++ b/src/lib/elm_widget.c
@@ -5154,6 +5154,8 @@ EAPI void
5154_elm_widget_item_del(Elm_Widget_Item *item) 5154_elm_widget_item_del(Elm_Widget_Item *item)
5155{ 5155{
5156 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5156 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5157 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5158 item->on_deletion = EINA_TRUE;
5157 5159
5158 //Widget item delete callback 5160 //Widget item delete callback
5159 if (item->del_pre_func) 5161 if (item->del_pre_func)
@@ -5179,6 +5181,7 @@ _elm_widget_item_del_pre_hook_set(Elm_Widget_Item *item,
5179 Elm_Widget_Del_Pre_Cb func) 5181 Elm_Widget_Del_Pre_Cb func)
5180{ 5182{
5181 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5183 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5184 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5182 item->del_pre_func = func; 5185 item->del_pre_func = func;
5183} 5186}
5184/** 5187/**
@@ -5195,6 +5198,7 @@ _elm_widget_item_style_set_hook_set(Elm_Widget_Item *item,
5195 Elm_Widget_Style_Set_Cb func) 5198 Elm_Widget_Style_Set_Cb func)
5196{ 5199{
5197 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5200 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5201 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5198 item->style_set_func = func; 5202 item->style_set_func = func;
5199} 5203}
5200 5204
@@ -5212,6 +5216,7 @@ _elm_widget_item_style_get_hook_set(Elm_Widget_Item *item,
5212 Elm_Widget_Style_Get_Cb func) 5216 Elm_Widget_Style_Get_Cb func)
5213{ 5217{
5214 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5218 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5219 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5215 item->style_get_func = func; 5220 item->style_get_func = func;
5216} 5221}
5217/** 5222/**
@@ -5259,6 +5264,7 @@ _elm_widget_item_del_cb_set(Elm_Widget_Item *item,
5259 Evas_Smart_Cb func) 5264 Evas_Smart_Cb func)
5260{ 5265{
5261 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5266 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5267 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5262 5268
5263 if ((item->del_func) && (item->del_func != func)) 5269 if ((item->del_func) && (item->del_func != func))
5264 WRN("You're replacing a previously set del_cb %p of item %p with %p", 5270 WRN("You're replacing a previously set del_cb %p of item %p with %p",
@@ -5280,6 +5286,8 @@ EAPI Evas_Object *
5280_elm_widget_item_widget_get(const Elm_Widget_Item *item) 5286_elm_widget_item_widget_get(const Elm_Widget_Item *item)
5281{ 5287{
5282 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); 5288 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
5289 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, NULL);
5290
5283 return item->widget; 5291 return item->widget;
5284} 5292}
5285 5293
@@ -5302,6 +5310,8 @@ _elm_widget_item_data_set(Elm_Widget_Item *item,
5302 const void *data) 5310 const void *data)
5303{ 5311{
5304 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5312 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5313 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5314
5305 if ((item->data) && (item->data != data)) 5315 if ((item->data) && (item->data != data))
5306 DBG("Replacing item %p data %p with %p", item, item->data, data); 5316 DBG("Replacing item %p data %p with %p", item, item->data, data);
5307 item->data = data; 5317 item->data = data;
@@ -5328,6 +5338,7 @@ _elm_widget_item_disabled_set(Elm_Widget_Item *item,
5328 Eina_Bool disabled) 5338 Eina_Bool disabled)
5329{ 5339{
5330 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5340 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5341 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5331 5342
5332 if (item->disabled == disabled) return; 5343 if (item->disabled == disabled) return;
5333 item->disabled = !!disabled; 5344 item->disabled = !!disabled;
@@ -5345,6 +5356,7 @@ EAPI void
5345_elm_widget_item_style_set(Elm_Widget_Item *item, const char *style) 5356_elm_widget_item_style_set(Elm_Widget_Item *item, const char *style)
5346{ 5357{
5347 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5358 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5359 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5348 item->style_set_func(item, style); 5360 item->style_set_func(item, style);
5349} 5361}
5350 5362
@@ -5360,6 +5372,7 @@ _elm_widget_item_disable_hook_set(Elm_Widget_Item *item,
5360 Elm_Widget_Disable_Cb func) 5372 Elm_Widget_Disable_Cb func)
5361{ 5373{
5362 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5374 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5375 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5363 item->disable_func = func; 5376 item->disable_func = func;
5364} 5377}
5365 5378
@@ -5370,6 +5383,7 @@ _elm_widget_item_domain_translatable_part_text_set(Elm_Widget_Item *item,
5370 const char *label) 5383 const char *label)
5371{ 5384{
5372 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5385 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5386 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5373 Elm_Translate_String_Data *ts; 5387 Elm_Translate_String_Data *ts;
5374 5388
5375 if (!label) 5389 if (!label)
@@ -5400,6 +5414,8 @@ _elm_widget_item_translatable_part_text_get(const Elm_Widget_Item *item,
5400 const char *part) 5414 const char *part)
5401{ 5415{
5402 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); 5416 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
5417 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, NULL);
5418
5403 Elm_Translate_String_Data *ts; 5419 Elm_Translate_String_Data *ts;
5404 ts = _translate_string_data_get(item->translate_strings, part); 5420 ts = _translate_string_data_get(item->translate_strings, part);
5405 if (ts) return ts->string; 5421 if (ts) return ts->string;
@@ -5413,6 +5429,7 @@ _elm_widget_item_domain_part_text_translatable_set(Elm_Widget_Item *item,
5413 Eina_Bool translatable) 5429 Eina_Bool translatable)
5414{ 5430{
5415 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5431 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5432 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5416 Elm_Translate_String_Data *ts; 5433 Elm_Translate_String_Data *ts;
5417 const char *text; 5434 const char *text;
5418 5435
@@ -5440,6 +5457,7 @@ EAPI void
5440_elm_widget_item_track_cancel(Elm_Widget_Item *item) 5457_elm_widget_item_track_cancel(Elm_Widget_Item *item)
5441{ 5458{
5442 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5459 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5460 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5443 5461
5444 if (!item->track_obj) return; 5462 if (!item->track_obj) return;
5445 5463
@@ -5453,6 +5471,7 @@ EAPI Evas_Object *
5453elm_widget_item_track(Elm_Widget_Item *item) 5471elm_widget_item_track(Elm_Widget_Item *item)
5454{ 5472{
5455 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); 5473 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
5474 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, NULL);
5456 5475
5457 if (item->track_obj) 5476 if (item->track_obj)
5458 { 5477 {
@@ -5496,6 +5515,7 @@ void
5496elm_widget_item_untrack(Elm_Widget_Item *item) 5515elm_widget_item_untrack(Elm_Widget_Item *item)
5497{ 5516{
5498 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5517 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5518 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5499 5519
5500 if (!item->track_obj) return; 5520 if (!item->track_obj) return;
5501 evas_object_unref(item->track_obj); 5521 evas_object_unref(item->track_obj);
@@ -5508,6 +5528,7 @@ int
5508elm_widget_item_track_get(const Elm_Widget_Item *item) 5528elm_widget_item_track_get(const Elm_Widget_Item *item)
5509{ 5529{
5510 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, 0); 5530 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, 0);
5531 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, 0);
5511 5532
5512 if (!item->track_obj) return 0; 5533 if (!item->track_obj) return 0;
5513 return evas_object_ref_get(item->track_obj); 5534 return evas_object_ref_get(item->track_obj);
@@ -5577,6 +5598,7 @@ _elm_widget_item_tooltip_text_set(Elm_Widget_Item *item,
5577 const char *text) 5598 const char *text)
5578{ 5599{
5579 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5600 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5601 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5580 EINA_SAFETY_ON_NULL_RETURN(text); 5602 EINA_SAFETY_ON_NULL_RETURN(text);
5581 5603
5582 text = eina_stringshare_add(text); 5604 text = eina_stringshare_add(text);
@@ -5590,6 +5612,7 @@ _elm_widget_item_tooltip_translatable_text_set(Elm_Widget_Item *item,
5590 const char *text) 5612 const char *text)
5591{ 5613{
5592 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5614 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5615 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5593 EINA_SAFETY_ON_NULL_RETURN(text); 5616 EINA_SAFETY_ON_NULL_RETURN(text);
5594 5617
5595 text = eina_stringshare_add(text); 5618 text = eina_stringshare_add(text);
@@ -5648,6 +5671,7 @@ _elm_widget_item_tooltip_content_cb_set(Elm_Widget_Item *item,
5648 Elm_Widget_Item_Tooltip *wit; 5671 Elm_Widget_Item_Tooltip *wit;
5649 5672
5650 ELM_WIDGET_ITEM_CHECK_OR_GOTO(item, error_noitem); 5673 ELM_WIDGET_ITEM_CHECK_OR_GOTO(item, error_noitem);
5674 //ELM_WIDGET_ITEM_RETURN_IF_GOTO(item, error_noitem);
5651 5675
5652 if (!func) 5676 if (!func)
5653 { 5677 {
@@ -5694,6 +5718,8 @@ EAPI void
5694_elm_widget_item_tooltip_unset(Elm_Widget_Item *item) 5718_elm_widget_item_tooltip_unset(Elm_Widget_Item *item)
5695{ 5719{
5696 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5720 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5721 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5722
5697 elm_object_tooltip_unset(item->view); 5723 elm_object_tooltip_unset(item->view);
5698} 5724}
5699 5725
@@ -5716,6 +5742,8 @@ _elm_widget_item_tooltip_style_set(Elm_Widget_Item *item,
5716 const char *style) 5742 const char *style)
5717{ 5743{
5718 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5744 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5745 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5746
5719 elm_object_tooltip_style_set(item->view, style); 5747 elm_object_tooltip_style_set(item->view, style);
5720} 5748}
5721 5749
@@ -5724,6 +5752,8 @@ _elm_widget_item_tooltip_window_mode_set(Elm_Widget_Item *item,
5724 Eina_Bool disable) 5752 Eina_Bool disable)
5725{ 5753{
5726 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, EINA_FALSE); 5754 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
5755 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, EINA_FALSE);
5756
5727 return elm_object_tooltip_window_mode_set(item->view, disable); 5757 return elm_object_tooltip_window_mode_set(item->view, disable);
5728} 5758}
5729 5759
@@ -5731,6 +5761,8 @@ EAPI Eina_Bool
5731_elm_widget_item_tooltip_window_mode_get(const Elm_Widget_Item *item) 5761_elm_widget_item_tooltip_window_mode_get(const Elm_Widget_Item *item)
5732{ 5762{
5733 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, EINA_FALSE); 5763 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, EINA_FALSE);
5764 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, EINA_FALSE);
5765
5734 return elm_object_tooltip_window_mode_get(item->view); 5766 return elm_object_tooltip_window_mode_get(item->view);
5735} 5767}
5736 5768
@@ -5749,6 +5781,7 @@ EAPI const char *
5749_elm_widget_item_tooltip_style_get(const Elm_Widget_Item *item) 5781_elm_widget_item_tooltip_style_get(const Elm_Widget_Item *item)
5750{ 5782{
5751 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); 5783 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
5784
5752 return elm_object_tooltip_style_get(item->view); 5785 return elm_object_tooltip_style_get(item->view);
5753} 5786}
5754 5787
@@ -5757,6 +5790,8 @@ _elm_widget_item_cursor_set(Elm_Widget_Item *item,
5757 const char *cursor) 5790 const char *cursor)
5758{ 5791{
5759 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5792 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5793 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5794
5760 elm_object_sub_cursor_set(item->view, item->widget, cursor); 5795 elm_object_sub_cursor_set(item->view, item->widget, cursor);
5761} 5796}
5762 5797
@@ -5771,6 +5806,8 @@ EAPI void
5771_elm_widget_item_cursor_unset(Elm_Widget_Item *item) 5806_elm_widget_item_cursor_unset(Elm_Widget_Item *item)
5772{ 5807{
5773 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5808 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5809 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5810
5774 elm_object_cursor_unset(item->view); 5811 elm_object_cursor_unset(item->view);
5775} 5812}
5776 5813
@@ -5792,6 +5829,8 @@ _elm_widget_item_cursor_style_set(Elm_Widget_Item *item,
5792 const char *style) 5829 const char *style)
5793{ 5830{
5794 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5831 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5832 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5833
5795 elm_object_cursor_style_set(item->view, style); 5834 elm_object_cursor_style_set(item->view, style);
5796} 5835}
5797 5836
@@ -5834,6 +5873,8 @@ _elm_widget_item_cursor_engine_only_set(Elm_Widget_Item *item,
5834 Eina_Bool engine_only) 5873 Eina_Bool engine_only)
5835{ 5874{
5836 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5875 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5876 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5877
5837 elm_object_cursor_theme_search_enabled_set(item->view, !engine_only); 5878 elm_object_cursor_theme_search_enabled_set(item->view, !engine_only);
5838} 5879}
5839 5880
@@ -5862,6 +5903,7 @@ _elm_widget_item_part_content_set(Elm_Widget_Item *item,
5862 Evas_Object *content) 5903 Evas_Object *content)
5863{ 5904{
5864 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5905 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5906 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5865 if (!item->content_set_func) 5907 if (!item->content_set_func)
5866 { 5908 {
5867 ERR("%s does not support elm_object_item_part_content_set() API.", 5909 ERR("%s does not support elm_object_item_part_content_set() API.",
@@ -5876,6 +5918,7 @@ _elm_widget_item_part_content_get(const Elm_Widget_Item *item,
5876 const char *part) 5918 const char *part)
5877{ 5919{
5878 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); 5920 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
5921 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, NULL);
5879 if (!item->content_get_func) 5922 if (!item->content_get_func)
5880 { 5923 {
5881 ERR("%s does not support elm_object_item_part_content_get() API.", 5924 ERR("%s does not support elm_object_item_part_content_get() API.",
@@ -5890,6 +5933,7 @@ _elm_widget_item_part_content_unset(Elm_Widget_Item *item,
5890 const char *part) 5933 const char *part)
5891{ 5934{
5892 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); 5935 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
5936 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, NULL);
5893 if (!item->content_unset_func) 5937 if (!item->content_unset_func)
5894 { 5938 {
5895 ERR("%s does not support elm_object_item_part_content_unset() API.", 5939 ERR("%s does not support elm_object_item_part_content_unset() API.",
@@ -5905,6 +5949,7 @@ _elm_widget_item_part_text_set(Elm_Widget_Item *item,
5905 const char *label) 5949 const char *label)
5906{ 5950{
5907 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5951 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5952 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5908 if (!item->text_set_func) 5953 if (!item->text_set_func)
5909 { 5954 {
5910 ERR("%s does not support elm_object_item_part_text_set() API.", 5955 ERR("%s does not support elm_object_item_part_text_set() API.",
@@ -5919,6 +5964,7 @@ _elm_widget_item_part_text_get(const Elm_Widget_Item *item,
5919 const char *part) 5964 const char *part)
5920{ 5965{
5921 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); 5966 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
5967 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, NULL);
5922 if (!item->text_get_func) 5968 if (!item->text_get_func)
5923 { 5969 {
5924 ERR("%s does not support elm_object_item_part_text_get() API.", 5970 ERR("%s does not support elm_object_item_part_text_get() API.",
@@ -5945,6 +5991,7 @@ _elm_widget_item_part_text_custom_set(Elm_Widget_Item *item,
5945{ 5991{
5946 Elm_Label_Data *label; 5992 Elm_Label_Data *label;
5947 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 5993 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
5994 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5948 5995
5949 if (!item->text_get_func) 5996 if (!item->text_get_func)
5950 { 5997 {
@@ -5995,6 +6042,7 @@ EAPI void
5995_elm_widget_item_part_text_custom_update(Elm_Widget_Item *item) 6042_elm_widget_item_part_text_custom_update(Elm_Widget_Item *item)
5996{ 6043{
5997 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6044 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6045 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
5998 if (item->labels) 6046 if (item->labels)
5999 eina_hash_foreach(item->labels, 6047 eina_hash_foreach(item->labels,
6000 _elm_widget_item_part_text_custom_foreach, item); 6048 _elm_widget_item_part_text_custom_foreach, item);
@@ -6005,6 +6053,8 @@ _elm_widget_item_content_set_hook_set(Elm_Widget_Item *item,
6005 Elm_Widget_Content_Set_Cb func) 6053 Elm_Widget_Content_Set_Cb func)
6006{ 6054{
6007 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6055 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6056 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6057
6008 item->content_set_func = func; 6058 item->content_set_func = func;
6009} 6059}
6010 6060
@@ -6013,6 +6063,8 @@ _elm_widget_item_content_get_hook_set(Elm_Widget_Item *item,
6013 Elm_Widget_Content_Get_Cb func) 6063 Elm_Widget_Content_Get_Cb func)
6014{ 6064{
6015 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6065 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6066 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6067
6016 item->content_get_func = func; 6068 item->content_get_func = func;
6017} 6069}
6018 6070
@@ -6021,6 +6073,8 @@ _elm_widget_item_content_unset_hook_set(Elm_Widget_Item *item,
6021 Elm_Widget_Content_Unset_Cb func) 6073 Elm_Widget_Content_Unset_Cb func)
6022{ 6074{
6023 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6075 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6076 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6077
6024 item->content_unset_func = func; 6078 item->content_unset_func = func;
6025} 6079}
6026 6080
@@ -6029,6 +6083,8 @@ _elm_widget_item_text_set_hook_set(Elm_Widget_Item *item,
6029 Elm_Widget_Text_Set_Cb func) 6083 Elm_Widget_Text_Set_Cb func)
6030{ 6084{
6031 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6085 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6086 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6087
6032 item->text_set_func = func; 6088 item->text_set_func = func;
6033} 6089}
6034 6090
@@ -6037,6 +6093,8 @@ _elm_widget_item_text_get_hook_set(Elm_Widget_Item *item,
6037 Elm_Widget_Text_Get_Cb func) 6093 Elm_Widget_Text_Get_Cb func)
6038{ 6094{
6039 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6095 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6096 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6097
6040 item->text_get_func = func; 6098 item->text_get_func = func;
6041} 6099}
6042 6100
@@ -6046,6 +6104,8 @@ _elm_widget_item_signal_emit(Elm_Widget_Item *item,
6046 const char *source) 6104 const char *source)
6047{ 6105{
6048 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6106 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6107 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6108
6049 if (item->signal_emit_func) 6109 if (item->signal_emit_func)
6050 item->signal_emit_func((Elm_Object_Item *)item, emission, source); 6110 item->signal_emit_func((Elm_Object_Item *)item, emission, source);
6051} 6111}
@@ -6055,6 +6115,8 @@ _elm_widget_item_signal_emit_hook_set(Elm_Widget_Item *item,
6055 Elm_Widget_Signal_Emit_Cb func) 6115 Elm_Widget_Signal_Emit_Cb func)
6056{ 6116{
6057 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6117 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6118 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6119
6058 item->signal_emit_func = func; 6120 item->signal_emit_func = func;
6059} 6121}
6060 6122
@@ -6066,6 +6128,7 @@ _elm_widget_item_signal_callback_add(Elm_Widget_Item *item,
6066 void *data) 6128 void *data)
6067{ 6129{
6068 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6130 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6131 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6069 EINA_SAFETY_ON_NULL_RETURN(func); 6132 EINA_SAFETY_ON_NULL_RETURN(func);
6070 6133
6071 Elm_Widget_Item_Signal_Data *wisd; 6134 Elm_Widget_Item_Signal_Data *wisd;
@@ -6104,6 +6167,7 @@ _elm_widget_item_signal_callback_del(Elm_Widget_Item *item,
6104 Eina_List *l; 6167 Eina_List *l;
6105 6168
6106 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL); 6169 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
6170 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, NULL);
6107 EINA_SAFETY_ON_NULL_RETURN_VAL(func, NULL); 6171 EINA_SAFETY_ON_NULL_RETURN_VAL(func, NULL);
6108 6172
6109 EINA_LIST_FOREACH(item->signals, l, wisd) 6173 EINA_LIST_FOREACH(item->signals, l, wisd)
@@ -6122,6 +6186,8 @@ _elm_widget_item_access_info_set(Elm_Widget_Item *item,
6122 const char *txt) 6186 const char *txt)
6123{ 6187{
6124 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6188 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6189 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6190
6125 eina_stringshare_del(item->access_info); 6191 eina_stringshare_del(item->access_info);
6126 if (!txt) item->access_info = NULL; 6192 if (!txt) item->access_info = NULL;
6127 else item->access_info = eina_stringshare_add(txt); 6193 else item->access_info = eina_stringshare_add(txt);
@@ -6131,6 +6197,7 @@ EAPI void
6131_elm_widget_item_translate(Elm_Widget_Item *item) 6197_elm_widget_item_translate(Elm_Widget_Item *item)
6132{ 6198{
6133 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item); 6199 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
6200 ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item);
6134 6201
6135#ifdef HAVE_GETTEXT 6202#ifdef HAVE_GETTEXT
6136 Elm_Translate_String_Data *ts; 6203 Elm_Translate_String_Data *ts;
diff --git a/src/lib/elm_widget.h b/src/lib/elm_widget.h
index a040ff293..d3fe1c380 100644
--- a/src/lib/elm_widget.h
+++ b/src/lib/elm_widget.h
@@ -586,6 +586,7 @@ struct _Elm_Widget_Item
586 Evas_Object *track_obj; 586 Evas_Object *track_obj;
587 587
588 Eina_Bool disabled : 1; 588 Eina_Bool disabled : 1;
589 Eina_Bool on_deletion : 1;
589 Eina_Bool on_translate : 1; 590 Eina_Bool on_translate : 1;
590}; 591};
591 592
@@ -1072,6 +1073,23 @@ EAPI void elm_widget_tree_dot_dump(const Evas_Object *top, FILE *out
1072#define elm_widget_item_part_text_custom_update(item) \ 1073#define elm_widget_item_part_text_custom_update(item) \
1073 _elm_widget_item_part_text_custom_update((Elm_Widget_Item *)item) 1074 _elm_widget_item_part_text_custom_update((Elm_Widget_Item *)item)
1074 1075
1076#define ELM_WIDGET_CHECK_OR_RETURN(obj, ...) \
1077 do { \
1078 if (!obj || !evas_object_smart_data_get(obj)) \
1079 { \
1080 ERR("Object [%p] is NULL or already deleted", obj);\
1081 return __VA_ARGS__; \
1082 } \
1083 } while (0)
1084
1085#define ELM_WIDGET_ITEM_RETURN_IF_ONDEL(item, ...) \
1086 do { \
1087 if (item && (item)->on_deletion) { \
1088 WRN("Elm_Widget_Item " # item " is deleting"); \
1089 return __VA_ARGS__; \
1090 } \
1091 } while (0)
1092
1075#define ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, ...) \ 1093#define ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, ...) \
1076 do { \ 1094 do { \
1077 if (!item) { \ 1095 if (!item) { \