}
static Eina_Bool
-_hash_foreach_pass_events_set(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+_hash_foreach_pass_events_set(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
{
Elm_Transit *transit = fdata;
evas_object_pass_events_set((Evas_Object*) key, transit->event_enabled);
}
static Eina_Bool
-_hash_foreach_obj_states_save(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+_hash_foreach_obj_states_save(const Eina_Hash *hash __UNUSED__, const void *key, void *data, void *fdata __UNUSED__)
{
_elm_transit_obj_states_save((Evas_Object *) key, (Elm_Obj_Data *) data);
return EINA_TRUE;
static void
_elm_transit_object_remove_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
{
- Elm_Transit *transit = data;
- Elm_Obj_Data *obj_data = eina_hash_find(transit->objs_data_hash, obj);
+ Elm_Transit *transit;
+ Elm_Obj_Data *obj_data;
+ Eina_List *list;
+
+ transit = data;
+ list = eina_list_data_find_list(transit->objs, obj);
+ obj_data = eina_hash_find(transit->objs_data_hash, list);
if (!obj_data) return;
- eina_hash_del_by_key(transit->objs_data_hash, obj);
+ eina_hash_del_by_key(transit->objs_data_hash, list);
evas_object_pass_events_set(obj, obj_data->pass_events);
if (obj_data->state)
free(obj_data->state);
if (!transit->objs) elm_transit_del(transit);
}
+//TODO: Remove!
+//Since evas map have a afterimage bug for this time.
+//This function is added temporary.
+static void
+_obj_damage_area_set(Evas_Object *obj)
+{
+ const Evas_Map *map;
+ Evas_Coord_Point coords;
+ Evas_Coord_Point min, max;
+ int i;
+
+ map = evas_object_map_get(obj);
+ if (!map) return;
+
+ evas_map_point_coord_get(map, 0, &coords.x, &coords.y, NULL);
+
+ max = min = coords;
+
+ for (i = 1; i < 4; ++i)
+ {
+ evas_map_point_coord_get(map, i, &coords.x, &coords.y, NULL);
+
+ if (coords.x < min.x)
+ min.x = coords.x;
+ else if (coords.x > max.x)
+ max.x = coords.x;
+
+ if (coords.y < min.y)
+ min.y = coords.y;
+ else if (coords.y > max.y)
+ max.y = coords.y;
+ }
+
+ evas_damage_rectangle_add(evas_object_evas_get(obj),
+ min.x, min.y,
+ max.x - min.x, max.y - min.y);
+}
+
+static void
+_remove_obj_from_list(Elm_Transit *transit, Evas_Object *obj)
+{
+ evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
+ _elm_transit_object_remove_cb,
+ transit);
+
+ //Remove duplicated objects
+ //TODO: Need to consider about optimizing here
+ while(1)
+ {
+ if (!eina_list_data_find_list(transit->objs, obj))
+ break;
+ transit->objs = eina_list_remove(transit->objs, obj);
+ }
+}
+
static void
_elm_transit_object_remove(Elm_Transit *transit, Evas_Object *obj)
{
- Elm_Obj_Data *obj_data = eina_hash_find(transit->objs_data_hash, obj);
- if (!obj_data) return;
- eina_hash_del_by_key(transit->objs_data_hash, obj);
- Elm_Obj_State *state = obj_data->state;
+ Elm_Obj_Data *obj_data;
+ Elm_Obj_State *state;
+ Eina_List *list;
+ list = eina_list_data_find_list(transit->objs, obj);
+ obj_data = eina_hash_find(transit->objs_data_hash, list);
+ if (!obj_data)
+ {
+ _remove_obj_from_list(transit, obj);
+ return;
+ }
+ eina_hash_del_by_key(transit->objs_data_hash, list);
+ _remove_obj_from_list(transit, obj);
evas_object_pass_events_set(obj, obj_data->pass_events);
-
+ state = obj_data->state;
if (state)
{
//recover the states of the object.
if (state->visible) evas_object_show(obj);
else evas_object_hide(obj);
if (state->map_enabled)
- evas_object_map_enable_set(obj, EINA_TRUE);
+ evas_object_map_enable_set(obj, EINA_TRUE);
else
- evas_object_map_enable_set(obj, EINA_FALSE);
+ evas_object_map_enable_set(obj, EINA_FALSE);
if (state->map)
- evas_object_map_set(obj, state->map);
+ evas_object_map_set(obj, state->map);
+
+ //TODO: Remove!
+ //Since evas map have a afterimage bug for this time.
+ //This line is added temporary.
+ _obj_damage_area_set(obj);
}
free(state);
}
free(obj_data);
- //remove duplicated objects
- //TODO: Need to consider about optimizing here
- while(1)
- {
- if (!eina_list_data_find_list(transit->objs, obj))
- break;
- transit->objs = eina_list_remove(transit->objs, obj);
- }
-
- evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
- _elm_transit_object_remove_cb,
- transit);
}
static void
{
effect_module = EINA_INLIST_CONTAINER_GET(transit->effect_list, Elm_Transit_Effect_Module);
transit->effect_list = eina_inlist_remove(transit->effect_list, transit->effect_list);
+ _elm_transit_effect_del(transit, effect_module);
}
while (transit->objs)
{
/* run chain transit */
if (transit->next_chain_transits)
- _chain_transits_go(transit);
+ _chain_transits_go(transit);
elm_transit_del(transit);
return ECORE_CALLBACK_CANCEL;
elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_LINEAR);
- transit->objs_data_hash = eina_hash_pointer_new(NULL);
+ transit->objs_data_hash = eina_hash_int32_new(NULL);
return transit;
}
ELM_TRANSIT_CHECK_OR_RETURN(transit);
EINA_SAFETY_ON_NULL_RETURN(obj);
Elm_Obj_Data *obj_data;
+ Eina_List * list;
+//TODO: Check the remove case of the same objects in this transit.
obj_data = ELM_NEW(Elm_Obj_Data);
obj_data->pass_events = evas_object_pass_events_get(obj);
if (!transit->event_enabled)
transit);
transit->objs = eina_list_append(transit->objs, obj);
- eina_hash_add(transit->objs_data_hash, obj, obj_data);
+ list = eina_list_last(transit->objs);
+ eina_hash_add(transit->objs_data_hash, list, obj_data);
if (!transit->state_keep)
_elm_transit_obj_states_save(obj, obj_data);
{
ELM_TRANSIT_CHECK_OR_RETURN(transit);
EINA_SAFETY_ON_NULL_RETURN(obj);
- Elm_Obj_Data *obj_data;
-
- obj_data = eina_hash_find(transit->objs_data_hash, obj);
- if (!obj_data) return;
_elm_transit_object_remove(transit, obj);
if (!transit->objs) elm_transit_del(transit);
elm_transit_event_enabled_set(Elm_Transit *transit, Eina_Bool enabled)
{
ELM_TRANSIT_CHECK_OR_RETURN(transit);
- Evas_Object *obj;
- Elm_Obj_Data *obj_data;
if (transit->event_enabled == enabled) return;
transit->event_enabled = !!enabled;
EAPI void
elm_transit_objects_final_state_keep_set(Elm_Transit *transit, Eina_Bool state_keep)
{
- Evas_Object *obj;
- Elm_Obj_Data *obj_data;
-
ELM_TRANSIT_CHECK_OR_RETURN(transit);
if (transit->state_keep == state_keep) return;
if (transit->animator) return;
* @note @p chain_transit can not be NULL. Chain transits could be chained to the only one transit.
*
* @param transit The transit object.
- * @param chain_transit The chain transit object. This transit will be operated * after transit is done.
+ * @param chain_transit The chain transit object. This transit will be operated
+ * after transit is done.
*
* @ingroup Transit
*/
if (!resizable_flip->nodes)
resizable_flip->nodes = _resizable_flip_nodes_build(transit,
- resizable_flip);
+ resizable_flip);
EINA_LIST_FOREACH(resizable_flip->nodes, elist, resizable_flip_node)
{
if (wipe->type == ELM_TRANSIT_EFFECT_WIPE_TYPE_SHOW)
_elm_fx_wipe_show(map, wipe->dir, _x, _y, _w, _h, (float)progress);
else
- _elm_fx_wipe_hide(map, wipe->dir, _x, _y, _w, _h, (float)progress);
+ _elm_fx_wipe_hide(map, wipe->dir, _x, _y, _w, _h, (float)progress);
evas_object_map_enable_set(obj, EINA_TRUE);
evas_object_map_set(obj, map);