ChangeLog and @since Vincent
On Thu, 27 Oct 2011, Enlightenment SVN wrote: > Log: > evas - added new API evas_object_freeze_events_set/get > > and will handle for the key events also soon. > > > > Author: hermet > Date: 2011-10-27 03:36:09 -0700 (Thu, 27 Oct 2011) > New Revision: 64432 > Trac: http://trac.enlightenment.org/e/changeset/64432 > > Modified: > trunk/evas/src/lib/Evas.h trunk/evas/src/lib/canvas/evas_events.c > trunk/evas/src/lib/canvas/evas_object_smart.c > trunk/evas/src/lib/include/evas_inline.x > trunk/evas/src/lib/include/evas_private.h > > Modified: trunk/evas/src/lib/Evas.h > =================================================================== > --- trunk/evas/src/lib/Evas.h 2011-10-27 10:17:44 UTC (rev 64431) > +++ trunk/evas/src/lib/Evas.h 2011-10-27 10:36:09 UTC (rev 64432) > @@ -3922,6 +3922,7 @@ > * @see evas_object_pass_events_get() for an example > * @see evas_object_repeat_events_set() > * @see evas_object_propagate_events_set() > + * @see evas_object_freeze_events_set() > */ > EAPI void evas_object_pass_events_set (Evas_Object *obj, > Eina_Bool pass) EINA_ARG_NONNULL(1); > > @@ -3942,6 +3943,7 @@ > * @see evas_object_pass_events_set() > * @see evas_object_repeat_events_get() > * @see evas_object_propagate_events_get() > + * @see evas_object_freeze_events_get() > */ > EAPI Eina_Bool evas_object_pass_events_get (const Evas_Object > *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE; > > @@ -3967,8 +3969,9 @@ > * See the full @ref Example_Evas_Stacking "example". > * > * @see evas_object_repeat_events_get() > - * @see evas_object_pass_events_get() > - * @see evas_object_propagate_events_get() > + * @see evas_object_pass_events_set() > + * @see evas_object_propagate_events_set() > + * @see evas_object_freeze_events_set() > */ > EAPI void evas_object_repeat_events_set (Evas_Object *obj, > Eina_Bool repeat) EINA_ARG_NONNULL(1); > > @@ -3980,8 +3983,9 @@ > * or not (@c EINA_FALSE) > * > * @see evas_object_repeat_events_set() for an example > - * @see evas_object_pass_events_set() > - * @see evas_object_propagate_events_set() > + * @see evas_object_pass_events_get() > + * @see evas_object_propagate_events_get() > + * @see evas_object_freeze_events_get() > */ > EAPI Eina_Bool evas_object_repeat_events_get (const Evas_Object > *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE; > > @@ -4002,10 +4006,10 @@ > * not be propagated on to the smart object of which @p obj is a > * member. The default value is @c EINA_TRUE. > * > - * @see evas_object_event_callback_add() > * @see evas_object_propagate_events_get() > - * @see evas_object_repeat_events_get() > - * @see evas_object_pass_events_get() > + * @see evas_object_repeat_events_set() > + * @see evas_object_pass_events_set() > + * @see evas_object_freeze_events_set() > */ > EAPI void evas_object_propagate_events_set (Evas_Object *obj, > Eina_Bool prop) EINA_ARG_NONNULL(1); > > @@ -4016,14 +4020,50 @@ > * @return whether @p obj is set to propagate events (@c EINA_TRUE) > * or not (@c EINA_FALSE) > * > - * @see evas_object_event_callback_add() > * @see evas_object_propagate_events_set() > - * @see evas_object_repeat_events_set() > - * @see evas_object_pass_events_set() > + * @see evas_object_repeat_events_get() > + * @see evas_object_pass_events_get() > + * @see evas_object_freeze_events_get() > */ > EAPI Eina_Bool evas_object_propagate_events_get (const Evas_Object > *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE; > > /** > + * Set whether an Evas object is to freeze (discard) events. > + * > + * @param obj the Evas object to operate on > + * @param pass whether @p obj is to freeze events (@c EINA_TRUE) or not > + * (@c EINA_FALSE) > + * > + * If @p freeze is @c EINA_TRUE, it will make events on @p obj to be @b > + * discarded. Unlike evas_object_pass_events_set(), events will not be > + * passed to @b next lower object. This API can be used for blocking > + * events while @p obj is on transiting. > + * > + * If @p freeze is @c EINA_FALSE, events will be processed on that > + * object as normal. > + * > + * @see evas_object_freeze_events_get() > + * @see evas_object_pass_events_set() > + * @see evas_object_repeat_events_set() > + * @see evas_object_propagate_events_set() > + */ > +EAPI void evas_object_freeze_events_set(Evas_Object *obj, > Eina_Bool freeze) EINA_ARG_NONNULL(1); > + > +/** > + * Determine whether an object is set to freeze (discard) events. > + * > + * @param obj the Evas object to get information from. > + * @return freeze whether @p obj is set to freeze events (@c EINA_TRUE) or > + * not (@c EINA_FALSE) > + * > + * @see evas_object_freeze_events_set() > + * @see evas_object_pass_events_get() > + * @see evas_object_repeat_events_get() > + * @see evas_object_propagate_events_get() > + */ > +EAPI Eina_Bool evas_object_freeze_events_get(const Evas_Object *obj) > EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE; > + > +/** > * @} > */ > > > Modified: trunk/evas/src/lib/canvas/evas_events.c > =================================================================== > --- trunk/evas/src/lib/canvas/evas_events.c 2011-10-27 10:17:44 UTC (rev > 64431) > +++ trunk/evas/src/lib/canvas/evas_events.c 2011-10-27 10:36:09 UTC (rev > 64432) > @@ -90,7 +90,8 @@ > if (inside && ((!obj->precise_is_inside) || > (evas_object_is_inside(obj, x, y)))) > { > - in = eina_list_append(in, obj); > + if (!evas_event_freezes_through(obj)) > + in = eina_list_append(in, obj); > if (!obj->repeat_events) > { > *no_rep = 1; > @@ -229,8 +230,10 @@ > * get a new event list, otherwise, keep the current grabbed list. */ > if (e->pointer.mouse_grabbed == 0) > { > - Eina_List *ins; > - ins = evas_event_objects_event_list(e, NULL, e->pointer.x, > e->pointer.y); > + Eina_List *ins = evas_event_objects_event_list(e, > + NULL, > + e->pointer.x, > + e->pointer.y); > /* free our old list of ins */ > e->pointer.object.in = eina_list_free(e->pointer.object.in); > /* and set up the new one */ > @@ -248,7 +251,6 @@ > EINA_LIST_FOREACH(copy, l, obj) > { > if (obj->delete_me) continue; > - > ev.canvas.x = e->pointer.x; > ev.canvas.y = e->pointer.y; > _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, > obj->mouse_grabbed); > @@ -1376,6 +1378,40 @@ > } > > EAPI void > +evas_object_freeze_events_set(Evas_Object *obj, Eina_Bool freeze) > +{ > + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); > + return; > + MAGIC_CHECK_END(); > + > + freeze = !!freeze; > + if (obj->freeze_events == freeze) return; > + obj->freeze_events = freeze; > + evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE); > + if (evas_object_is_in_output_rect(obj, > + obj->layer->evas->pointer.x, > + obj->layer->evas->pointer.y, 1, 1) && > + ((!obj->precise_is_inside) || > + (evas_object_is_inside(obj, > + obj->layer->evas->pointer.x, > + obj->layer->evas->pointer.y)))) > + evas_event_feed_mouse_move(obj->layer->evas, > + obj->layer->evas->pointer.x, > + obj->layer->evas->pointer.y, > + obj->layer->evas->last_timestamp, > + NULL); > +} > + > +EAPI Eina_Bool > +evas_object_freeze_events_get(const Evas_Object *obj) > +{ > + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); > + return 0; > + MAGIC_CHECK_END(); > + return obj->freeze_events; > +} > + > +EAPI void > evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass) > { > MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); > @@ -1384,7 +1420,7 @@ > pass = !!pass; > if (obj->pass_events == pass) return; > obj->pass_events = pass; > - evas_object_smart_member_cache_invalidate(obj); > + evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_FALSE); > if (evas_object_is_in_output_rect(obj, > obj->layer->evas->pointer.x, > obj->layer->evas->pointer.y, 1, 1) && > > Modified: trunk/evas/src/lib/canvas/evas_object_smart.c > =================================================================== > --- trunk/evas/src/lib/canvas/evas_object_smart.c 2011-10-27 10:17:44 UTC > (rev 64431) > +++ trunk/evas/src/lib/canvas/evas_object_smart.c 2011-10-27 10:36:09 UTC > (rev 64432) > @@ -164,7 +164,7 @@ > obj->layer->usage++; > obj->smart.parent = smart_obj; > o->contained = eina_inlist_append(o->contained, EINA_INLIST_GET(obj)); > - evas_object_smart_member_cache_invalidate(obj); > + evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_TRUE); > obj->restack = 1; > evas_object_change(obj); > evas_object_mapped_clip_across_mark(obj); > @@ -191,7 +191,7 @@ > o = (Evas_Object_Smart *)(obj->smart.parent->object_data); > o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(obj)); > obj->smart.parent = NULL; > - evas_object_smart_member_cache_invalidate(obj); > + evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_TRUE); > obj->layer->usage--; > obj->cur.layer = obj->layer->layer; > evas_object_inject(obj, obj->layer->evas); > @@ -751,7 +751,9 @@ > } > > void > -evas_object_smart_member_cache_invalidate(Evas_Object *obj) > +evas_object_smart_member_cache_invalidate(Evas_Object *obj, > + Eina_Bool pass_events, > + Eina_Bool freeze_events) > { > Evas_Object_Smart *o; > Evas_Object *member; > @@ -760,13 +762,18 @@ > return; > MAGIC_CHECK_END(); > > - obj->parent_cache.pass_events_valid = EINA_FALSE; > + if (pass_events) > + obj->parent_cache.pass_events_valid = EINA_FALSE; > + if (freeze_events) > + obj->parent_cache.freeze_events_valid = EINA_FALSE; > > o = obj->object_data; > if (o->magic != MAGIC_OBJ_SMART) return; > > - EINA_INLIST_FOREACH(o->contained, member); > - evas_object_smart_member_cache_invalidate(member); > + EINA_INLIST_FOREACH(o->contained, member) > + evas_object_smart_member_cache_invalidate(member, > + pass_events, > + freeze_events); > } > > void > > Modified: trunk/evas/src/lib/include/evas_inline.x > =================================================================== > --- trunk/evas/src/lib/include/evas_inline.x 2011-10-27 10:17:44 UTC (rev > 64431) > +++ trunk/evas/src/lib/include/evas_inline.x 2011-10-27 10:36:09 UTC (rev > 64432) > @@ -70,6 +70,22 @@ > return 0; > } > > +static inline Eina_Bool > +evas_event_freezes_through(Evas_Object *obj) > +{ > + if (obj->freeze_events) return EINA_TRUE; > + if (obj->parent_cache.freeze_events_valid) > + return obj->parent_cache.freeze_events; > + if (obj->smart.parent) > + { > + Eina_Bool freeze = evas_event_freezes_through(obj->smart.parent); > + obj->parent_cache.freeze_events_valid = EINA_TRUE; > + obj->parent_cache.freeze_events = freeze; > + return freeze; > + } > + return EINA_FALSE; > +} > + > static inline int > evas_event_passes_through(Evas_Object *obj) > { > > Modified: trunk/evas/src/lib/include/evas_private.h > =================================================================== > --- trunk/evas/src/lib/include/evas_private.h 2011-10-27 10:17:44 UTC (rev > 64431) > +++ trunk/evas/src/lib/include/evas_private.h 2011-10-27 10:36:09 UTC (rev > 64432) > @@ -580,11 +580,14 @@ > > Eina_Bool store : 1; > Eina_Bool pass_events : 1; > + Eina_Bool freeze_events : 1; > + Eina_Bool repeat_events : 1; > struct { > Eina_Bool pass_events : 1; > Eina_Bool pass_events_valid : 1; > + Eina_Bool freeze_events : 1; > + Eina_Bool freeze_events_valid : 1; > } parent_cache; > - Eina_Bool repeat_events : 1; > Eina_Bool restack : 1; > Eina_Bool is_active : 1; > Eina_Bool precise_is_inside : 1; > @@ -978,7 +981,7 @@ > Evas_Font_Description *evas_font_desc_ref(Evas_Font_Description *fdesc); > void * evas_font_load(Evas *evas, Evas_Font_Description *fdesc, const char > *source, Evas_Font_Size size); > void evas_font_load_hinting_set(Evas *evas, void *font, int hinting); > -void evas_object_smart_member_cache_invalidate(Evas_Object *obj); > +void evas_object_smart_member_cache_invalidate(Evas_Object *obj, Eina_Bool > pass_events, Eina_Bool freeze_events); > void evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int > *t, int *b); > void _evas_object_text_rehint(Evas_Object *obj); > void _evas_object_textblock_rehint(Evas_Object *obj); > > > ------------------------------------------------------------------------------ > The demand for IT networking professionals continues to grow, and the > demand for specialized networking skills is growing even more rapidly. > Take a complimentary Learning@Cisco Self-Assessment and learn > about Cisco certifications, training, and career opportunities. > http://p.sf.net/sfu/cisco-dev2dev > _______________________________________________ > enlightenment-svn mailing list > enlightenment-...@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > > ------------------------------------------------------------------------------ The demand for IT networking professionals continues to grow, and the demand for specialized networking skills is growing even more rapidly. Take a complimentary Learning@Cisco Self-Assessment and learn about Cisco certifications, training, and career opportunities. http://p.sf.net/sfu/cisco-dev2dev _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel