evas/proxy - added 2 more apis. not enough yet. will fix them soon.

evas_object_image_source_events_set/get



SVN revision: 78361
This commit is contained in:
ChunEon Park 2012-10-23 08:44:11 +00:00
parent 7f71bab887
commit d115ff8e3b
4 changed files with 397 additions and 37 deletions

View File

@ -9159,6 +9159,44 @@ EAPI void evas_object_image_source_visible_set(Evas_Obj
*/
EAPI Eina_Bool evas_object_image_source_visible_get(const Evas_Object *obj) EINA_ARG_NONNULL(1);
/**
* Set whether an Evas object is to source events.
*
* @param obj Proxy (image) object.
* @param source whether @p obj is to pass events (@c EINA_TRUE) or not
* (@c EINA_FALSE)
*
* Set whether an Evas object is to repeat events to source.
*
* If @p source is @c EINA_TRUE, it will make events on @p obj to also be
* repeated for the source object (see evas_object_image_source_set()). Even the
* @p obj and source geometries are different, the event position will be
* transformed to the source object's space.
*
* If @p source is @c EINA_FALSE, events occurring on @p obj will be
* processed only on it.
*
* @see evas_object_image_source_get()
* @see evas_object_image_source_visible_set()
* @see evas_object_source_events_set()
* @since 1.8
*/
EAPI void evas_object_image_source_events_set(Evas_Object *obj, Eina_Bool source) EINA_ARG_NONNULL(1);
/**
* Determine whether an object is set to source events.
*
* @param obj Proxy (image) object.
* @return source whether @p obj is set to source events (@c EINA_TRUE) or not
* (@c EINA_FALSE)
*
* @see evas_object_image_source_set()
* @see evas_object_image_source_visible_set()
* @see evas_object_source_events_set()
* @since 1.8
*/
EAPI Eina_Bool evas_object_image_source_events_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
/**
* Check if a file extension may be supported by @ref Evas_Object_Image.
*
@ -18047,6 +18085,8 @@ enum
EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_SET,
EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_SET,
EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_GET,
EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_SET,
EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_GET,
EVAS_OBJ_IMAGE_SUB_ID_LAST
};
@ -18150,6 +18190,28 @@ enum
*/
#define evas_obj_image_source_visible_get(visible) EVAS_OBJ_IMAGE_ID(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_GET), EO_TYPECHECK(Eina_Bool *, visible)
/**
* @def evas_obj_image_source_events_set
*
* Set events to be repeated to the source object.
*
* @param[in] source in
*
* @see evas_object_image_source_events_get
*/
#define evas_obj_image_source_events_set(source) EVAS_OBJ_IMAGE_ID(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_SET), EO_TYPECHECK(Eina_Bool, source)
/**
* @def evas_obj_image_source_events_get
*
* Get the state of the source event.
*
* @param[out] source out
*
* @see evas_obj_image_source_event_set
*/
#define evas_obj_image_source_events_get(source) EVAS_OBJ_IMAGE_ID(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_GET), EO_TYPECHECK(Eina_Bool *, source)
/**
* @def evas_obj_image_border_set
* @since 1.8

View File

@ -4,7 +4,7 @@
static Eina_List *
_evas_event_object_list_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *list, Evas_Object *stop,
int x, int y, int *no_rep);
int x, int y, int *no_rep, Eina_Bool source);
static void
_evas_event_havemap_adjust(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Evas_Coord *x, Evas_Coord *y, Eina_Bool mouse_grabbed)
@ -42,7 +42,7 @@ _evas_event_framespace_adjust(Evas_Object *eo_obj, Evas_Coord *x, Evas_Coord *y)
static Eina_List *
_evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *list, Evas_Object *stop,
int x, int y, int *no_rep)
int x, int y, int *no_rep, Eina_Bool source)
{
Evas_Object *eo_obj;
Evas_Object_Protected_Data *obj;
@ -59,11 +59,14 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
*no_rep = 1;
return in;
}
if (evas_event_passes_through(eo_obj, obj)) continue;
if (evas_object_is_source_invisible(eo_obj, obj)) continue;
if ((obj->cur.visible) && (obj->delete_me == 0) &&
(!obj->clip.clipees) &&
(evas_object_clippers_is_visible(eo_obj, obj)))
if (!source)
{
if (evas_event_passes_through(eo_obj, obj)) continue;
if (evas_object_is_source_invisible(eo_obj, obj)) continue;
}
if ((obj->delete_me == 0) &&
((source) || ((obj->cur.visible) && (!obj->clip.clipees) &&
evas_object_clippers_is_visible(eo_obj, obj))))
{
if (obj->is_smart)
{
@ -89,7 +92,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
stop,
obj->cur.geometry.x + obj->cur.map->mx,
obj->cur.geometry.y + obj->cur.map->my,
&norep);
&norep, source);
}
}
}
@ -108,7 +111,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
obj->cur.geometry.y + obj->cur.geometry.h >= y))
in = _evas_event_object_list_in_get
(eo_e, in, evas_object_smart_members_get_direct(eo_obj),
stop, x, y, &norep);
stop, x, y, &norep, source);
}
if (norep)
{
@ -154,14 +157,61 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
return in;
}
static void
_evas_object_source_event(Evas_Object *eo_obj, Evas *eo_e, Evas_Callback_Type type, void *ev, int event_id)
{
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
Evas_Object *src_eo = _evas_object_image_source_get(eo_obj);
Evas_Object_Protected_Data *src = eo_data_get(src_eo,
EVAS_OBJ_CLASS);
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
//FIXME: consider coord transformation for map.
Evas_Coord w1 = obj->cur.geometry.w;
Evas_Coord h1 = obj->cur.geometry.h;
Evas_Coord w2 = src->cur.geometry.w;
Evas_Coord h2 = src->cur.geometry.h;
Evas_Coord tx = e->pointer.x - obj->cur.geometry.x;
Evas_Coord ty = e->pointer.y - obj->cur.geometry.y;
if (w1 != w2)
tx = (Evas_Coord) ((float)tx * ((float)w2 / (float)w1));
if (h1 != h2)
ty = (Evas_Coord) ((float)ty * ((float)w2 / (float)w1));
Evas_Coord x = src->cur.geometry.x + tx;
Evas_Coord y = src->cur.geometry.y + ty;
if (src->is_smart)
{
Eina_List *in = NULL, *l = NULL;
Evas_Object *child_eo;
Evas_Object_Protected_Data *child;
int no_rep = 0;
//Optimize Here: Keep this list in proxy image for up and move
in = _evas_event_object_list_raw_in_get(eo_e, in,
evas_object_smart_members_get_direct(src_eo), NULL, x, y, &no_rep, EINA_TRUE);
EINA_LIST_FOREACH(in, l, child_eo)
{
if (obj->delete_me || src->delete_me) return;
child = eo_data_get(child_eo, EVAS_OBJ_CLASS);
if (child->delete_me) continue;
//FIXME: trasform the ev coords in src space also.
evas_object_event_callback_call(child_eo, child,
type,
ev,
event_id);
}
eina_list_free(in);
}
else
evas_object_event_callback_call(src_eo, src, type, ev, event_id);
}
static Eina_List *
_evas_event_object_list_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *list, Evas_Object *stop,
int x, int y, int *no_rep)
int x, int y, int *no_rep, Eina_Bool source)
{
if (!list) return NULL;
return _evas_event_object_list_raw_in_get(eo_e, in, list->last, stop, x, y,
no_rep);
no_rep, source);
}
Eina_List *
@ -177,7 +227,7 @@ evas_event_objects_event_list(Evas *eo_e, Evas_Object *stop, int x, int y)
int no_rep = 0;
in = _evas_event_object_list_in_get(eo_e, in,
EINA_INLIST_GET(lay->objects),
stop, x, y, &no_rep);
stop, x, y, &no_rep, EINA_FALSE);
if (no_rep) return in;
}
return in;
@ -411,7 +461,18 @@ _canvas_event_feed_mouse_down(Eo *eo_e, void *_pd, va_list *list)
_evas_event_havemap_adjust(eo_obj, obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_DOWN, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_DOWN, &ev,
event_id);
//pass event to source
if (obj->proxy.is_proxy)
{
printf("MOUSE DOWN! %d\n", EVAS_CALLBACK_MOUSE_DOWN);
_evas_object_source_event(eo_obj, eo_e, EVAS_CALLBACK_MOUSE_DOWN,
&ev, event_id);
}
}
if (e->delete_me) break;
if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
break;
@ -469,7 +530,16 @@ _post_up_handle(Evas *eo_e, unsigned int timestamp, const void *data)
{
obj->mouse_in = 0;
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_OUT,
&ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_OUT,
&ev, event_id);
}
}
}
if (e->delete_me) break;
@ -509,7 +579,15 @@ _post_up_handle(Evas *eo_e, unsigned int timestamp, const void *data)
{
obj_itr->mouse_in = 1;
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj_itr, obj_itr, EVAS_CALLBACK_MOUSE_IN, &ev_in, event_id);
{
evas_object_event_callback_call(eo_obj_itr, obj_itr,
EVAS_CALLBACK_MOUSE_IN, &ev_in, event_id);
//pass event to source
if (obj_itr->proxy.is_proxy)
_evas_object_source_event(eo_obj_itr, eo_e,
EVAS_CALLBACK_MOUSE_IN,
&ev, event_id);
}
}
}
if (e->delete_me) break;
@ -613,7 +691,16 @@ _canvas_event_feed_mouse_up(Eo *eo_e, void *_pd, va_list *list)
{
if ((!e->is_frozen) &&
(!evas_event_freezes_through(eo_obj, obj)))
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_UP, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_UP,
&ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_UP,
&ev, event_id);
}
}
if (e->delete_me) break;
if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
@ -730,7 +817,16 @@ _canvas_event_feed_mouse_wheel(Eo *eo_e, void *_pd, va_list *list)
_evas_event_framespace_adjust(eo_obj, &ev.canvas.x, &ev.canvas.y);
_evas_event_havemap_adjust(eo_obj, obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
if ((!e->is_frozen) && !evas_event_freezes_through(eo_obj, obj))
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_WHEEL, &ev,
event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_WHEEL, &ev,
event_id);
}
if (e->delete_me) break;
}
if (copy) copy = eina_list_free(copy);
@ -832,7 +928,14 @@ _canvas_event_feed_mouse_move(Eo *eo_e, void *_pd, va_list *list)
(!obj->clip.clipees))
{
if ((px != x) || (py != y))
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
}
}
else
outs = eina_list_append(outs, eo_obj);
@ -889,7 +992,15 @@ _canvas_event_feed_mouse_move(Eo *eo_e, void *_pd, va_list *list)
if (!obj->delete_me)
{
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
{
evas_object_event_callback_call(eo_obj,
obj,
EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
}
}
}
}
@ -981,6 +1092,11 @@ _canvas_event_feed_mouse_move(Eo *eo_e, void *_pd, va_list *list)
ev.cur.canvas.y = e->pointer.y;
_evas_event_havemap_adjust(eo_obj, obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_MOVE,
&ev, event_id);
}
}
/* otherwise it has left the object */
@ -994,7 +1110,15 @@ _canvas_event_feed_mouse_move(Eo *eo_e, void *_pd, va_list *list)
_evas_event_framespace_adjust(eo_obj, &ev2.canvas.x, &ev2.canvas.y);
_evas_event_havemap_adjust(eo_obj, obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_OUT,
&ev2, event_id);
}
}
}
if (e->delete_me) break;
@ -1020,7 +1144,16 @@ _canvas_event_feed_mouse_move(Eo *eo_e, void *_pd, va_list *list)
{
obj->mouse_in = 1;
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_IN,
&ev3, event_id2);
}
}
}
if (e->delete_me) break;
@ -1118,7 +1251,7 @@ nogrep:
ins = _evas_event_object_list_raw_in_get(eo_e, NULL,
EINA_INLIST_GET(below_obj), NULL,
e->pointer.x, e->pointer.y,
&norep);
&norep, EINA_FALSE);
}
EINA_LIST_FOREACH(copy, l, eo_obj)
{
@ -1156,6 +1289,11 @@ nogrep:
_evas_event_framespace_adjust(eo_obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
_evas_event_havemap_adjust(eo_obj, obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_MOVE,
&ev, event_id);
}
}
/* otherwise it has left the object */
@ -1169,7 +1307,15 @@ nogrep:
_evas_event_framespace_adjust(eo_obj, &ev2.canvas.x, &ev2.canvas.y);
_evas_event_havemap_adjust(eo_obj, obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_OUT,
&ev2, event_id);
}
}
}
if (e->delete_me) break;
@ -1195,7 +1341,15 @@ nogrep:
{
obj->mouse_in = 1;
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_IN,
&ev3, event_id2);
}
}
}
if (e->delete_me) break;
@ -1273,7 +1427,16 @@ _canvas_event_feed_mouse_in(Eo *eo_e, void *_pd, va_list *list)
{
obj->mouse_in = 1;
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_IN,
&ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_IN,
&ev, event_id);
}
}
}
if (e->delete_me) break;
@ -1350,7 +1513,15 @@ _canvas_event_feed_mouse_out(Eo *eo_e, void *_pd, va_list *list)
if (!obj->delete_me)
{
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MOUSE_OUT,
&ev, event_id);
}
}
obj->mouse_grabbed = 0;
}
@ -1465,7 +1636,15 @@ _canvas_event_feed_multi_down(Eo *eo_e, void *_pd, va_list *list)
if (y != ev.canvas.y)
ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_DOWN, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MULTI_DOWN, &ev,
event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e, EVAS_CALLBACK_MULTI_DOWN,
&ev, event_id);
}
if (e->delete_me) break;
}
if (copy) eina_list_free(copy);
@ -1568,7 +1747,15 @@ _canvas_event_feed_multi_up(Eo *eo_e, void *_pd, va_list *list)
e->pointer.mouse_grabbed--;
}
if (!e->is_frozen)
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_UP, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MULTI_UP, &ev,
event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e, EVAS_CALLBACK_MULTI_UP,
&ev, event_id);
}
if (e->delete_me) break;
}
if (copy) copy = eina_list_free(copy);
@ -1675,7 +1862,12 @@ _canvas_event_feed_multi_move(Eo *eo_e, void *_pd, va_list *list)
ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
if (y != ev.cur.canvas.y)
ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MULTI_MOVE, &ev,
event_id);
}
if (e->delete_me) break;
}
@ -1747,6 +1939,11 @@ _canvas_event_feed_multi_move(Eo *eo_e, void *_pd, va_list *list)
if (y != ev.cur.canvas.y)
ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e,
EVAS_CALLBACK_MULTI_MOVE, &ev,
event_id);
}
if (e->delete_me) break;
}
@ -1841,6 +2038,11 @@ _canvas_event_feed_key_down(Eo *eo_e, void *_pd, va_list *list)
evas_object_event_callback_call(g->object, object_obj,
EVAS_CALLBACK_KEY_DOWN,
&ev, event_id);
//pass event to source
if (object_obj->proxy.is_proxy)
_evas_object_source_event(g->object, eo_e,
EVAS_CALLBACK_KEY_DOWN,
&ev, event_id);
if (g->exclusive) exclusive = EINA_TRUE;
}
}
@ -1870,8 +2072,17 @@ _canvas_event_feed_key_down(Eo *eo_e, void *_pd, va_list *list)
{
Evas_Object_Protected_Data *focused_obj = eo_data_get(e->focused, EVAS_OBJ_CLASS);
if (!e->is_frozen && !evas_event_freezes_through(e->focused, focused_obj))
evas_object_event_callback_call(e->focused, focused_obj, EVAS_CALLBACK_KEY_DOWN,
&ev, event_id);
{
evas_object_event_callback_call(e->focused, focused_obj,
EVAS_CALLBACK_KEY_DOWN,
&ev, event_id);
//pass event to source
if (focused_obj->proxy.is_proxy)
_evas_object_source_event(e->focused, eo_e,
EVAS_CALLBACK_KEY_DOWN,
&ev, event_id);
}
}
_evas_post_event_callback_call(eo_e, e);
if (ev.dev) _evas_device_unref(ev.dev);
@ -1946,8 +2157,16 @@ _canvas_event_feed_key_up(Eo *eo_e, void *_pd, va_list *list)
Evas_Object_Protected_Data *object_obj = eo_data_get(g->object, EVAS_OBJ_CLASS);
if (!e->is_frozen &&
!evas_event_freezes_through(g->object, object_obj))
evas_object_event_callback_call(g->object, object_obj,
EVAS_CALLBACK_KEY_UP, &ev, event_id);
{
evas_object_event_callback_call(g->object, object_obj,
EVAS_CALLBACK_KEY_UP,
&ev, event_id);
//pass event to source
if (object_obj->proxy.is_proxy)
_evas_object_source_event(g->object, eo_e,
EVAS_CALLBACK_KEY_UP,
&ev, event_id);
}
if (g->exclusive) exclusive = EINA_TRUE;
}
if (e->delete_me) break;
@ -1978,8 +2197,16 @@ _canvas_event_feed_key_up(Eo *eo_e, void *_pd, va_list *list)
{
Evas_Object_Protected_Data *focused_obj = eo_data_get(e->focused, EVAS_OBJ_CLASS);
if (!e->is_frozen && !evas_event_freezes_through(e->focused, focused_obj))
evas_object_event_callback_call(e->focused, focused_obj, EVAS_CALLBACK_KEY_UP,
&ev, event_id);
{
evas_object_event_callback_call(e->focused, focused_obj,
EVAS_CALLBACK_KEY_UP,
&ev, event_id);
//pass event to source
if (focused_obj->proxy.is_proxy)
_evas_object_source_event(e->focused, eo_e,
EVAS_CALLBACK_KEY_UP,
&ev, event_id);
}
}
_evas_post_event_callback_call(eo_e, e);
if (ev.dev) _evas_device_unref(ev.dev);
@ -2024,7 +2251,14 @@ _canvas_event_feed_hold(Eo *eo_e, void *_pd, va_list *list)
{
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
if ((!e->is_frozen) && !evas_event_freezes_through(eo_obj, obj))
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_HOLD, &ev, event_id);
{
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_HOLD,
&ev, event_id);
//pass event to source
if (obj->proxy.is_proxy)
_evas_object_source_event(eo_obj, eo_e, EVAS_CALLBACK_HOLD, &ev,
event_id);
}
if (e->delete_me) break;
}
if (copy) copy = eina_list_free(copy);

View File

@ -89,6 +89,7 @@ struct _Evas_Object_Image
Eina_Bool filled : 1;
Eina_Bool proxyrendering : 1;
Eina_Bool source_invisible : 1;
Eina_Bool source_events: 1;
Eina_Bool preloading : 1;
Eina_Bool video_surface : 1;
Eina_Bool video_visible : 1;
@ -541,7 +542,7 @@ evas_object_image_source_get(const Evas_Object *eo_obj)
}
static void
_image_source_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
_image_source_get(Eo *eo_obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
{
const Evas_Object_Image *o = _pd;
Evas_Object **source = va_arg(*list, Evas_Object **);
@ -556,6 +557,52 @@ evas_object_image_source_unset(Evas_Object *eo_obj)
return result;
}
EAPI void
evas_object_image_source_events_set(Evas_Object *eo_obj, Eina_Bool source_events)
{
MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
eo_do(eo_obj, evas_obj_image_source_events_set(source_events));
}
static void
_image_source_events_set(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
{
Evas_Object_Image *o = _pd;
Eina_Bool source_events = va_arg(*list, int);
source_events = !!source_events;
if (o->source_events == source_events) return;
o->source_events = source_events;
if (!o->cur.source) return;
if ((o->source_invisible) || (!source_events)) return;
//FIXME: Feed mouse events here.
}
EAPI Eina_Bool
evas_object_image_source_events_get(const Evas_Object *eo_obj)
{
MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
return EINA_FALSE;
MAGIC_CHECK_END();
Eina_Bool source_events;
eo_do((Eo*)eo_obj, evas_obj_image_source_events_get(&source_events));
return source_events;
}
static void
_image_source_events_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
{
Evas_Object_Image *o = _pd;
Eina_Bool *source_events = va_arg(*list, Eina_Bool *);
if (!source_events) return;
*source_events = o->source_events;
}
EAPI void
evas_object_image_source_visible_set(Evas_Object *eo_obj, Eina_Bool visible)
{
@ -583,6 +630,7 @@ _image_source_visible_set(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
evas_object_smart_member_cache_invalidate(o->cur.source, EINA_FALSE,
EINA_FALSE, EINA_TRUE);
evas_object_change(o->cur.source, src_obj);
if ((!visible) || (!o->source_events)) return;
//FIXME: Feed mouse events here.
}
@ -2619,8 +2667,10 @@ _proxy_unset(Evas_Object *proxy)
if (!o->cur.source) return;
Evas_Object_Protected_Data *cur_source = eo_data_get(o->cur.source, EVAS_OBJ_CLASS);
Evas_Object_Protected_Data *cur_proxy = eo_data_get(proxy, EVAS_OBJ_CLASS);
cur_source->proxy.proxies = eina_list_remove(cur_source->proxy.proxies, proxy);
cur_proxy->proxy.is_proxy = EINA_FALSE;
if (cur_source->proxy.source_invisible)
{
@ -2642,10 +2692,12 @@ static void
_proxy_set(Evas_Object *eo_proxy, Evas_Object *eo_src)
{
Evas_Object_Protected_Data *src = eo_data_get(eo_src, EVAS_OBJ_CLASS);
Evas_Object_Protected_Data *proxy = eo_data_get(eo_proxy, EVAS_OBJ_CLASS);
Evas_Object_Image *o = eo_data_get(eo_proxy, MY_CLASS);
evas_object_image_file_set(eo_proxy, NULL, NULL);
proxy->proxy.is_proxy = EINA_TRUE;
o->cur.source = eo_src;
o->load_error = EVAS_LOAD_ERROR_NONE;
@ -4340,6 +4392,12 @@ evas_object_image_filled_resize_listener(void *data __UNUSED__, Evas *e __UNUSED
evas_object_image_fill_set(obj, 0, 0, w, h);
}
Evas_Object *
_evas_object_image_source_get(Evas_Object *eo_obj)
{
Evas_Object_Image *o = eo_data_get(eo_obj, MY_CLASS);
return o->cur.source;
}
Eina_Bool
_evas_object_image_preloading_get(const Evas_Object *eo_obj)
@ -4489,6 +4547,8 @@ _class_constructor(Eo_Class *klass)
EO_OP_FUNC(EVAS_OBJ_IMAGE_ID(EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_SET), _image_animated_frame_set),
EO_OP_FUNC(EVAS_OBJ_IMAGE_ID(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_SET), _image_source_visible_set),
EO_OP_FUNC(EVAS_OBJ_IMAGE_ID(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_GET), _image_source_visible_get),
EO_OP_FUNC(EVAS_OBJ_IMAGE_ID(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_SET), _image_source_events_set),
EO_OP_FUNC(EVAS_OBJ_IMAGE_ID(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_GET), _image_source_events_get),
EO_OP_FUNC_SENTINEL
};
@ -4562,6 +4622,8 @@ static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(EVAS_OBJ_IMAGE_SUB_ID_ANIMATED_FRAME_SET, "Set the frame to current frame of an image object."),
EO_OP_DESCRIPTION(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_SET, "Set the source object visibility of a given image object being used as a proxy."),
EO_OP_DESCRIPTION(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_VISIBLE_GET, "Get the source object visibility of a given image object being used as a proxy."),
EO_OP_DESCRIPTION(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_SET, "Set the events to be repeated to the source object."),
EO_OP_DESCRIPTION(EVAS_OBJ_IMAGE_SUB_ID_SOURCE_EVENTS_GET, "Get the state of the source events."),
EO_OP_DESCRIPTION_SENTINEL
};

View File

@ -595,6 +595,7 @@ struct _Evas_Object_Protected_Data
Eina_List *proxies;
void *surface;
int w,h;
Eina_Bool is_proxy : 1;
Eina_Bool redraw : 1;
Eina_Bool source_invisible : 1;
} proxy;
@ -1013,6 +1014,7 @@ void evas_smart_cb_descriptions_fix(Evas_Smart_Cb_Description_Array *a) EINA_ARG
Eina_Bool evas_smart_cb_descriptions_resize(Evas_Smart_Cb_Description_Array *a, unsigned int size) EINA_ARG_NONNULL(1);
const Evas_Smart_Cb_Description *evas_smart_cb_description_find(const Evas_Smart_Cb_Description_Array *a, const char *name) EINA_ARG_NONNULL(1, 2) EINA_PURE;
Evas_Object *_evas_object_image_source_get(Evas_Object *obj);
Eina_Bool _evas_object_image_preloading_get(const Evas_Object *obj);
void _evas_object_image_preloading_set(Evas_Object *obj, Eina_Bool preloading);
void _evas_object_image_preloading_check(Evas_Object *obj);