and will handle for the key events also soon.
SVN revision: 64432
* @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);
* @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;
* 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);
* 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;
* 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);
* @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;
+
+/**
* @}
*/
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;
* 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 */
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);
}
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);
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) &&
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);
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);
}
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;
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
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)
{
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;
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);