discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=bbb04ecb32736cc2ed781b1ac29dd7fbcf7dcb42

commit bbb04ecb32736cc2ed781b1ac29dd7fbcf7dcb42
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Mon Feb 2 13:38:48 2015 -0500

    ref/free client pixmaps during hide animations
    
    replaces wl client crashing with a garbage frame
---
 src/bin/e_comp_object.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c
index 4b78de8..7944df0 100644
--- a/src/bin/e_comp_object.c
+++ b/src/bin/e_comp_object.c
@@ -631,20 +631,24 @@ static void
 _e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char 
*emission, const char *source EINA_UNUSED)
 {
    E_Comp_Object *cw = data;
+   Eina_Bool hiding;
 
    //INF("DONE DEFER %p: %dx%d - %s", cw->ec, cw->w, cw->h, emission);
    /* visible clients which have never been sized are a bug */
    if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || 
(cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
      CRI("ACK!");
+   hiding = !strcmp(emission, "e,action,hide,done");
    if (cw->animating)
      {
         cw->animating--;
         cw->comp->animating--;
+        if (hiding)
+          e_pixmap_free(cw->ec->pixmap);
         /* remove ref from animation start, account for possibility of 
deletion from unref */
         if (!e_object_unref(E_OBJECT(cw->ec))) return;
      }
    /* hide only after animation finishes to guarantee a full run of the 
animation */
-   if (cw->defer_hide && (!strcmp(emission, "e,action,hide,done")))
+   if (cw->defer_hide && hiding)
      evas_object_hide(cw->smart_obj);
    else if (!cw->animating)
      e_comp_shape_queue(cw->comp);
@@ -1275,6 +1279,7 @@ _e_comp_intercept_hide(void *data, Evas_Object *obj)
                   cw->comp->animating++;
                   cw->animating++;
                   e_object_ref(E_OBJECT(cw->ec));
+                  e_pixmap_ref(cw->ec->pixmap);
                }
              cw->defer_hide = !!cw->animating;
              if (!cw->animating)

-- 


Reply via email to