remember comp object dirty state and update when necessary

normal clients rely upon the guarantee that they will receive another resize on next render when size updates occur before visibility happens, but overrides will never receive another resize since they always size accurately. by remembering that the state was previously considered dirty, render updates which occur before visibility are no longer lost until the next damage/resize occurs

tl;dr: your menus show up again
This commit is contained in:
Mike Blumenkrantz 2014-02-03 14:00:12 -05:00
parent 20c09a3891
commit de9dde6daf
1 changed files with 10 additions and 2 deletions

View File

@ -91,6 +91,7 @@ typedef struct _E_Comp_Object
Eina_Bool zoomap_disabled : 1; //whether zoomap is usable
Eina_Bool updates_exist : 1;
Eina_Bool updates_full : 1; // entire object will be updated
Eina_Bool dirty : 1; //object is dirty but not visible
Eina_Bool force_move : 1;
} E_Comp_Object;
@ -1838,6 +1839,8 @@ _e_comp_smart_show(Evas_Object *obj)
}
if (!cw->animating)
e_comp_object_effect_set(obj, NULL);
if (cw->dirty)
e_comp_object_render_update_add(obj);
}
static void
@ -3016,9 +3019,14 @@ e_comp_object_dirty(Evas_Object *obj)
Eina_Bool dirty;
API_ENTRY;
cw->dirty = 0;
evas_object_geometry_get(cw->obj, NULL, NULL, &ow, &oh);
if ((!ow) && (!oh)) return; //get it on the next resize
if ((!ow) && (!oh))
{
RENDER_DEBUG("DIRTY REJECTED(%p)", cw->ec);
cw->dirty = !cw->visible;
return; //get it on the next resize/show
}
dirty = e_pixmap_size_get(cw->ec->pixmap, &w, &h);
if (!dirty) w = h = 1;
evas_object_image_pixels_dirty_set(cw->obj, dirty);