diff --git a/legacy/evas/src/lib/canvas/evas_object_main.c b/legacy/evas/src/lib/canvas/evas_object_main.c index fe26a76e29..9332e66c28 100644 --- a/legacy/evas/src/lib/canvas/evas_object_main.c +++ b/legacy/evas/src/lib/canvas/evas_object_main.c @@ -67,7 +67,8 @@ evas_object_change(Evas_Object *obj) { Eina_List *l; Evas_Object *obj2; - + Eina_Bool movch = 0; + if (obj->layer->evas->nochange) { // printf("nochange %p\n", obj); @@ -76,11 +77,26 @@ evas_object_change(Evas_Object *obj) // else // printf("ch %p\n", obj); obj->layer->evas->changed = 1; - if (obj->changed) return; + if (obj->changed_move) + { + movch = 1; + obj->changed_move = 0; + if (!obj->changed_nomove) obj->changed_move_only = 1; + if (obj->changed) return; + } + else + { + obj->changed_move_only = 0; + obj->changed_nomove = 1; + if (obj->changed) return; + } // obj->changed = 1; evas_render_object_recalc(obj); /* set changed flag on all objects this one clips too */ - EINA_LIST_FOREACH(obj->clip.clipees, l, obj2) evas_object_change(obj2); + if (!((movch) && (obj->is_static_clip))) + { + EINA_LIST_FOREACH(obj->clip.clipees, l, obj2) evas_object_change(obj2); + } if (obj->smart.parent) evas_object_change(obj->smart.parent); } @@ -437,6 +453,7 @@ evas_object_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) obj->cur.geometry.x = x; obj->cur.geometry.y = y; //// obj->cur.cache.geometry.validity = 0; + obj->changed_move = 1; evas_object_change(obj); evas_object_clip_dirty(obj); obj->doing.in_move--; diff --git a/legacy/evas/src/lib/canvas/evas_render.c b/legacy/evas/src/lib/canvas/evas_render.c index 04f7d8c12c..3b2659ee71 100644 --- a/legacy/evas/src/lib/canvas/evas_render.c +++ b/legacy/evas/src/lib/canvas/evas_render.c @@ -607,9 +607,56 @@ pending_change(void *data, void *gdata __UNUSED__) obj->pre_render_done = 0; //// FIXME: this wipes out changes obj->changed = 0; + obj->changed_move_only = 0; + obj->changed_nomove = 0; + obj->changed_move = 0; } return obj->changed ? EINA_TRUE : EINA_FALSE; } +/* +static void +unchange(Evas_Object *obj) +{ + Evas_Object *obj2; + + if (!obj->changed) return; + obj->changed = 0; + obj->changed_move_only = 0; + obj->changed_nomove = 0; + obj->changed_move = 0; + EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj2) + { + unchange(obj2); + } +} + +static int +chlist(Evas_Object *obj, int i) +{ + Evas_Object *obj2; + int j; + int ret = 0; + + if (!obj->changed) return 0; + for (j = 0; j < i; j++) printf(" "); + printf("ch2 %p %s %i [%i %i %ix%i] v %i/%i [r%i] %p\n", obj, + obj->type, + obj->changed_move_only, + obj->cur.geometry.x, + obj->cur.geometry.y, + obj->cur.geometry.w, + obj->cur.geometry.h, + obj->cur.visible, + obj->prev.visible, + obj->restack, + obj->clip.clipees); + EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj2) + { + if (obj2->changed) + ret |= chlist(obj2, i + 1); + } +} +*/ static Eina_Bool evas_render_mapped(Evas *e, Evas_Object *obj, void *context, void *surface, @@ -725,23 +772,37 @@ evas_render_mapped(Evas *e, Evas_Object *obj, void *context, void *surface, !evas_object_was_visible(obj2)) { obj2->changed = 0; + obj2->changed_move_only = 0; + obj2->changed_nomove = 0; + obj2->changed_move = 0; continue; } if (obj2->changed) { - obj2->changed = 0; +// chlist(obj2, 0); changed = 1; + obj2->changed = 0; + obj2->changed_move_only = 0; + obj2->changed_nomove = 0; + obj2->changed_move = 0; break; } } +// unchange(obj); obj->changed = 0; + obj->changed_move_only = 0; + obj->changed_nomove = 0; + obj->changed_move = 0; } else { if (obj->changed) { - obj->changed = 0; changed = 1; + obj->changed = 0; + obj->changed_move_only = 0; + obj->changed_nomove = 0; + obj->changed_move = 0; } } @@ -1306,6 +1367,9 @@ evas_render_updates_internal(Evas *e, obj->func->render_post(obj); obj->restack = 0; obj->changed = 0; + obj->changed_move_only = 0; + obj->changed_nomove = 0; + obj->changed_move = 0; } else if ((obj->cur.map != obj->prev.map) || (obj->cur.usemap != obj->prev.usemap)) @@ -1314,6 +1378,9 @@ evas_render_updates_internal(Evas *e, obj->func->render_post(obj); obj->restack = 0; obj->changed = 0; + obj->changed_move_only = 0; + obj->changed_nomove = 0; + obj->changed_move = 0; } /* moved to other pre-process phase 1 if (obj->delete_me == 2) diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index bff57f0f86..5e2677720c 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -460,9 +460,9 @@ struct _Evas_Object Eina_Bool parent_cache_valid : 1; Eina_Bool repeat_events : 1; Eina_Bool restack : 1; - Eina_Bool changed : 1; - Eina_Bool changed_move : 1; Eina_Bool is_active : 1; + Eina_Bool precise_is_inside : 1; + Eina_Bool is_static_clip : 1; Eina_Bool render_pre : 1; Eina_Bool rect_del : 1; @@ -473,8 +473,10 @@ struct _Evas_Object Eina_Bool in_layer : 1; Eina_Bool no_propagate : 1; - Eina_Bool precise_is_inside : 1; - Eina_Bool is_static_clip : 1; + Eina_Bool changed : 1; + Eina_Bool changed_move : 1; + Eina_Bool changed_move_only : 1; + Eina_Bool changed_nomove : 1; }; struct _Evas_Func_Node