forked from enlightenment/efl
evas - added new API evas_object_freeze_events_set/get
and will handle for the key events also soon. SVN revision: 64432
This commit is contained in:
parent
09eed6ec5d
commit
000aed92b8
|
@ -3922,6 +3922,7 @@ EAPI void *evas_object_event_callback_del_full(Evas_Object *obj, Eva
|
||||||
* @see evas_object_pass_events_get() for an example
|
* @see evas_object_pass_events_get() for an example
|
||||||
* @see evas_object_repeat_events_set()
|
* @see evas_object_repeat_events_set()
|
||||||
* @see evas_object_propagate_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);
|
EAPI void evas_object_pass_events_set (Evas_Object *obj, Eina_Bool pass) EINA_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
@ -3942,6 +3943,7 @@ EAPI void evas_object_pass_events_set (Evas_Object *obj, Ein
|
||||||
* @see evas_object_pass_events_set()
|
* @see evas_object_pass_events_set()
|
||||||
* @see evas_object_repeat_events_get()
|
* @see evas_object_repeat_events_get()
|
||||||
* @see evas_object_propagate_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;
|
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 @@ EAPI Eina_Bool evas_object_pass_events_get (const Evas_Object *ob
|
||||||
* See the full @ref Example_Evas_Stacking "example".
|
* See the full @ref Example_Evas_Stacking "example".
|
||||||
*
|
*
|
||||||
* @see evas_object_repeat_events_get()
|
* @see evas_object_repeat_events_get()
|
||||||
* @see evas_object_pass_events_get()
|
* @see evas_object_pass_events_set()
|
||||||
* @see evas_object_propagate_events_get()
|
* @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);
|
EAPI void evas_object_repeat_events_set (Evas_Object *obj, Eina_Bool repeat) EINA_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
@ -3980,8 +3983,9 @@ EAPI void evas_object_repeat_events_set (Evas_Object *obj, Ein
|
||||||
* or not (@c EINA_FALSE)
|
* or not (@c EINA_FALSE)
|
||||||
*
|
*
|
||||||
* @see evas_object_repeat_events_set() for an example
|
* @see evas_object_repeat_events_set() for an example
|
||||||
* @see evas_object_pass_events_set()
|
* @see evas_object_pass_events_get()
|
||||||
* @see evas_object_propagate_events_set()
|
* @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;
|
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 @@ EAPI Eina_Bool evas_object_repeat_events_get (const Evas_Object *ob
|
||||||
* not be propagated on to the smart object of which @p obj is a
|
* not be propagated on to the smart object of which @p obj is a
|
||||||
* member. The default value is @c EINA_TRUE.
|
* member. The default value is @c EINA_TRUE.
|
||||||
*
|
*
|
||||||
* @see evas_object_event_callback_add()
|
|
||||||
* @see evas_object_propagate_events_get()
|
* @see evas_object_propagate_events_get()
|
||||||
* @see evas_object_repeat_events_get()
|
* @see evas_object_repeat_events_set()
|
||||||
* @see evas_object_pass_events_get()
|
* @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);
|
EAPI void evas_object_propagate_events_set (Evas_Object *obj, Eina_Bool prop) EINA_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
@ -4016,13 +4020,49 @@ EAPI void evas_object_propagate_events_set (Evas_Object *obj, Ein
|
||||||
* @return whether @p obj is set to propagate events (@c EINA_TRUE)
|
* @return whether @p obj is set to propagate events (@c EINA_TRUE)
|
||||||
* or not (@c EINA_FALSE)
|
* or not (@c EINA_FALSE)
|
||||||
*
|
*
|
||||||
* @see evas_object_event_callback_add()
|
|
||||||
* @see evas_object_propagate_events_set()
|
* @see evas_object_propagate_events_set()
|
||||||
* @see evas_object_repeat_events_set()
|
* @see evas_object_repeat_events_get()
|
||||||
* @see evas_object_pass_events_set()
|
* @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;
|
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -90,6 +90,7 @@ _evas_event_object_list_in_get(Evas *e, Eina_List *in,
|
||||||
if (inside && ((!obj->precise_is_inside) ||
|
if (inside && ((!obj->precise_is_inside) ||
|
||||||
(evas_object_is_inside(obj, x, y))))
|
(evas_object_is_inside(obj, x, y))))
|
||||||
{
|
{
|
||||||
|
if (!evas_event_freezes_through(obj))
|
||||||
in = eina_list_append(in, obj);
|
in = eina_list_append(in, obj);
|
||||||
if (!obj->repeat_events)
|
if (!obj->repeat_events)
|
||||||
{
|
{
|
||||||
|
@ -229,8 +230,10 @@ evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int
|
||||||
* get a new event list, otherwise, keep the current grabbed list. */
|
* get a new event list, otherwise, keep the current grabbed list. */
|
||||||
if (e->pointer.mouse_grabbed == 0)
|
if (e->pointer.mouse_grabbed == 0)
|
||||||
{
|
{
|
||||||
Eina_List *ins;
|
Eina_List *ins = evas_event_objects_event_list(e,
|
||||||
ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
|
NULL,
|
||||||
|
e->pointer.x,
|
||||||
|
e->pointer.y);
|
||||||
/* free our old list of ins */
|
/* free our old list of ins */
|
||||||
e->pointer.object.in = eina_list_free(e->pointer.object.in);
|
e->pointer.object.in = eina_list_free(e->pointer.object.in);
|
||||||
/* and set up the new one */
|
/* and set up the new one */
|
||||||
|
@ -248,7 +251,6 @@ evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int
|
||||||
EINA_LIST_FOREACH(copy, l, obj)
|
EINA_LIST_FOREACH(copy, l, obj)
|
||||||
{
|
{
|
||||||
if (obj->delete_me) continue;
|
if (obj->delete_me) continue;
|
||||||
|
|
||||||
ev.canvas.x = e->pointer.x;
|
ev.canvas.x = e->pointer.x;
|
||||||
ev.canvas.y = e->pointer.y;
|
ev.canvas.y = e->pointer.y;
|
||||||
_evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
|
_evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
|
||||||
|
@ -1375,6 +1377,40 @@ evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data
|
||||||
_evas_object_event_new();
|
_evas_object_event_new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
EAPI void
|
||||||
evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
|
evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
|
||||||
{
|
{
|
||||||
|
@ -1384,7 +1420,7 @@ evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
|
||||||
pass = !!pass;
|
pass = !!pass;
|
||||||
if (obj->pass_events == pass) return;
|
if (obj->pass_events == pass) return;
|
||||||
obj->pass_events = pass;
|
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,
|
if (evas_object_is_in_output_rect(obj,
|
||||||
obj->layer->evas->pointer.x,
|
obj->layer->evas->pointer.x,
|
||||||
obj->layer->evas->pointer.y, 1, 1) &&
|
obj->layer->evas->pointer.y, 1, 1) &&
|
||||||
|
|
|
@ -164,7 +164,7 @@ evas_object_smart_member_add(Evas_Object *obj, Evas_Object *smart_obj)
|
||||||
obj->layer->usage++;
|
obj->layer->usage++;
|
||||||
obj->smart.parent = smart_obj;
|
obj->smart.parent = smart_obj;
|
||||||
o->contained = eina_inlist_append(o->contained, EINA_INLIST_GET(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;
|
obj->restack = 1;
|
||||||
evas_object_change(obj);
|
evas_object_change(obj);
|
||||||
evas_object_mapped_clip_across_mark(obj);
|
evas_object_mapped_clip_across_mark(obj);
|
||||||
|
@ -191,7 +191,7 @@ evas_object_smart_member_del(Evas_Object *obj)
|
||||||
o = (Evas_Object_Smart *)(obj->smart.parent->object_data);
|
o = (Evas_Object_Smart *)(obj->smart.parent->object_data);
|
||||||
o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(obj));
|
o->contained = eina_inlist_remove(o->contained, EINA_INLIST_GET(obj));
|
||||||
obj->smart.parent = NULL;
|
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->layer->usage--;
|
||||||
obj->cur.layer = obj->layer->layer;
|
obj->cur.layer = obj->layer->layer;
|
||||||
evas_object_inject(obj, obj->layer->evas);
|
evas_object_inject(obj, obj->layer->evas);
|
||||||
|
@ -751,7 +751,9 @@ evas_object_smart_cleanup(Evas_Object *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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_Smart *o;
|
||||||
Evas_Object *member;
|
Evas_Object *member;
|
||||||
|
@ -760,13 +762,18 @@ evas_object_smart_member_cache_invalidate(Evas_Object *obj)
|
||||||
return;
|
return;
|
||||||
MAGIC_CHECK_END();
|
MAGIC_CHECK_END();
|
||||||
|
|
||||||
|
if (pass_events)
|
||||||
obj->parent_cache.pass_events_valid = EINA_FALSE;
|
obj->parent_cache.pass_events_valid = EINA_FALSE;
|
||||||
|
if (freeze_events)
|
||||||
|
obj->parent_cache.freeze_events_valid = EINA_FALSE;
|
||||||
|
|
||||||
o = obj->object_data;
|
o = obj->object_data;
|
||||||
if (o->magic != MAGIC_OBJ_SMART) return;
|
if (o->magic != MAGIC_OBJ_SMART) return;
|
||||||
|
|
||||||
EINA_INLIST_FOREACH(o->contained, member);
|
EINA_INLIST_FOREACH(o->contained, member)
|
||||||
evas_object_smart_member_cache_invalidate(member);
|
evas_object_smart_member_cache_invalidate(member,
|
||||||
|
pass_events,
|
||||||
|
freeze_events);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -70,6 +70,22 @@ evas_object_is_opaque(Evas_Object *obj)
|
||||||
return 0;
|
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
|
static inline int
|
||||||
evas_event_passes_through(Evas_Object *obj)
|
evas_event_passes_through(Evas_Object *obj)
|
||||||
{
|
{
|
||||||
|
|
|
@ -580,11 +580,14 @@ struct _Evas_Object
|
||||||
|
|
||||||
Eina_Bool store : 1;
|
Eina_Bool store : 1;
|
||||||
Eina_Bool pass_events : 1;
|
Eina_Bool pass_events : 1;
|
||||||
|
Eina_Bool freeze_events : 1;
|
||||||
|
Eina_Bool repeat_events : 1;
|
||||||
struct {
|
struct {
|
||||||
Eina_Bool pass_events : 1;
|
Eina_Bool pass_events : 1;
|
||||||
Eina_Bool pass_events_valid : 1;
|
Eina_Bool pass_events_valid : 1;
|
||||||
|
Eina_Bool freeze_events : 1;
|
||||||
|
Eina_Bool freeze_events_valid : 1;
|
||||||
} parent_cache;
|
} parent_cache;
|
||||||
Eina_Bool repeat_events : 1;
|
|
||||||
Eina_Bool restack : 1;
|
Eina_Bool restack : 1;
|
||||||
Eina_Bool is_active : 1;
|
Eina_Bool is_active : 1;
|
||||||
Eina_Bool precise_is_inside : 1;
|
Eina_Bool precise_is_inside : 1;
|
||||||
|
@ -978,7 +981,7 @@ int evas_font_desc_cmp(const Evas_Font_Description *a, const Evas_Font_Descripti
|
||||||
Evas_Font_Description *evas_font_desc_ref(Evas_Font_Description *fdesc);
|
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(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_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_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_text_rehint(Evas_Object *obj);
|
||||||
void _evas_object_textblock_rehint(Evas_Object *obj);
|
void _evas_object_textblock_rehint(Evas_Object *obj);
|
||||||
|
|
Loading…
Reference in New Issue