diff --git a/src/lib/eo/efl_object.eo b/src/lib/eo/efl_object.eo index 97a9489c30..a0d500bfea 100644 --- a/src/lib/eo/efl_object.eo +++ b/src/lib/eo/efl_object.eo @@ -129,6 +129,17 @@ abstract Efl.Object () finalized: bool; [[$true if the object is invalidated, $false otherwise]] } } + @property invalidating { + [[True if the object is about to be invalidated, and the invalidation of the children is already happening. + + Note this is true before the invalidate call on the object. + ]] + get { + } + values { + invalidating: bool; [[$true if the object is invalidating, $false otherwise]] + } + } provider_find @const { [[Searches upwards in the object tree for a provider which knows the given class/interface. diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c index 5acc70bca2..b2de426e37 100644 --- a/src/lib/eo/eo_base_class.c +++ b/src/lib/eo/eo_base_class.c @@ -827,6 +827,16 @@ _efl_object_invalidated_get(const Eo *obj_id, Efl_Object_Data *pd) return invalidate; } +EOLIAN static Eina_Bool +_efl_object_invalidating_get(const Eo *obj_id, Efl_Object_Data *pd EINA_UNUSED) +{ + Eina_Bool invalidating; + EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, EINA_TRUE); + invalidating = obj->is_invalidating; + EO_OBJ_DONE(obj_id); + return invalidating; +} + EOLIAN static Efl_Object * _efl_object_provider_find(const Eo *obj, Efl_Object_Data *pd, const Efl_Object *klass) { diff --git a/src/tests/eo/suite/eo_test_lifecycle.c b/src/tests/eo/suite/eo_test_lifecycle.c index b0c67bca45..190a7366ca 100644 --- a/src/tests/eo/suite/eo_test_lifecycle.c +++ b/src/tests/eo/suite/eo_test_lifecycle.c @@ -162,6 +162,35 @@ EFL_START_TEST(eo_test_unref_noref) } EFL_END_TEST + +typedef struct { + Eo *par; + Eina_Bool called; +} Invalidating_Test_Helper; + +static void +_invalidate2(void *data, const Efl_Event *ev EINA_UNUSED) +{ + Invalidating_Test_Helper *iev = data; + + iev->called = EINA_TRUE; + ck_assert_int_eq(efl_invalidating_get(iev->par), EINA_TRUE); + ck_assert_int_eq(efl_invalidated_get(iev->par), EINA_FALSE); +} + +EFL_START_TEST(eo_test_invalidating_get) +{ + Eo *par = efl_add_ref(SIMPLE_CLASS, NULL); + Eo *obj = efl_add(SIMPLE_CLASS, par); + Invalidating_Test_Helper data = {par, EINA_FALSE}; + + efl_event_callback_add(obj, EFL_EVENT_INVALIDATE, _invalidate2, &data); + + efl_unref(par); + ck_assert_int_eq(data.called, EINA_TRUE); +} +EFL_END_TEST + void eo_test_lifecycle(TCase *tc) { tcase_add_test(tc, eo_test_base_del); @@ -169,4 +198,5 @@ void eo_test_lifecycle(TCase *tc) tcase_add_test(tc, eo_test_shutdown_eventting); tcase_add_test(tc, eo_test_del_in_noref); tcase_add_test(tc, eo_test_unref_noref); + tcase_add_test(tc, eo_test_invalidating_get); }