discomfitor pushed a commit to branch master.

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

commit 6b246c7c8a3fcaff08aa24d4d29c40c77cb1b441
Author: Mike Blumenkrantz <zm...@samsung.com>
Date:   Wed Jan 22 17:16:10 2014 -0500

    clean up comp object autoclosing when overwriting existing autoclose object
---
 src/bin/e_comp_object.c | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c
index 74d5cc4..bd96a11 100644
--- a/src/bin/e_comp_object.c
+++ b/src/bin/e_comp_object.c
@@ -3289,15 +3289,14 @@ e_comp_object_effect_stop(Evas_Object *obj, 
Edje_Signal_Cb end_cb EINA_UNUSED)
 ////////////////////////////////////
 
 static void
-_e_comp_object_autoclose_cleanup(E_Comp *c)
+_e_comp_object_autoclose_cleanup(E_Comp *c, Eina_Bool already_del)
 {
    if (c->autoclose.obj)
      {
-        c = e_comp_util_evas_object_comp_get(c->autoclose.obj);
         e_comp_ungrab_input(c, 0, 1);
         if (c->autoclose.del_cb)
           c->autoclose.del_cb(c->autoclose.data, c->autoclose.obj);
-        else
+        else if (!already_del)
           {
              evas_object_hide(c->autoclose.obj);
              E_FREE_FUNC(c->autoclose.obj, evas_object_del);
@@ -3321,14 +3320,14 @@ _e_comp_object_autoclose_key_down_cb(void *data, int 
type EINA_UNUSED, void *eve
 
    if (c->autoclose.key_cb)
      del = !c->autoclose.key_cb(c->autoclose.data, ev);
-   if (del) _e_comp_object_autoclose_cleanup(data);
+   if (del) _e_comp_object_autoclose_cleanup(data, 0);
    return ECORE_CALLBACK_RENEW;
 }
 
 static void
 _e_comp_object_autoclose_mouse_up_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   _e_comp_object_autoclose_cleanup(data);
+   _e_comp_object_autoclose_cleanup(data, 0);
 }
 
 static void
@@ -3339,17 +3338,18 @@ _e_comp_object_autoclose_setup(Evas_Object *obj)
    if (!c->autoclose.rect)
      {
         c->autoclose.rect = evas_object_rectangle_add(c->evas);
+        evas_object_move(c->autoclose.rect, 0, 0);
+        evas_object_resize(c->autoclose.rect, c->man->w, c->man->h);
+        evas_object_show(c->autoclose.rect);
         evas_object_name_set(c->autoclose.rect, "c->autoclose.rect");
         evas_object_color_set(c->autoclose.rect, 0, 0, 0, 0);
         evas_object_event_callback_add(c->autoclose.rect, 
EVAS_CALLBACK_MOUSE_UP, _e_comp_object_autoclose_mouse_up_cb, c);
+        e_comp_grab_input(c, 0, 1);
      }
-   evas_object_move(c->autoclose.rect, 0, 0);
-   evas_object_resize(c->autoclose.rect, c->man->w, c->man->h);
    evas_object_layer_set(c->autoclose.rect, evas_object_layer_get(obj) - 1);
-   evas_object_show(c->autoclose.rect);
    e_comp_shape_queue(c);
-   c->autoclose.key_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, 
_e_comp_object_autoclose_key_down_cb, c);
-   e_comp_grab_input(c, 0, 1);
+   if (!c->autoclose.key_handler)
+     c->autoclose.key_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, 
_e_comp_object_autoclose_key_down_cb, c);
 }
 
 static void
@@ -3363,7 +3363,7 @@ static void
 _e_comp_object_autoclose_del(void *data, Evas *e EINA_UNUSED, Evas_Object 
*obj, void *event_info EINA_UNUSED)
 {
    evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, 
_e_comp_object_autoclose_show);
-   _e_comp_object_autoclose_cleanup(data);
+   _e_comp_object_autoclose_cleanup(data, 1);
 }
 
 EAPI void
@@ -3377,11 +3377,17 @@ e_comp_object_util_autoclose(Evas_Object *obj, 
E_Comp_Object_Autoclose_Cb del_cb
    EINA_SAFETY_ON_NULL_RETURN(c);
    if (c->autoclose.obj)
      {
-        /* block overwrite of current autoclose object */
-        if (c->autoclose.obj != obj) return;
+        if (c->autoclose.obj == obj) return;
+        evas_object_event_callback_del_full(c->autoclose.obj, 
EVAS_CALLBACK_DEL, _e_comp_object_autoclose_del, c);
+        c->autoclose.obj = obj;
         c->autoclose.del_cb = del_cb;
         c->autoclose.key_cb = cb;
         c->autoclose.data = (void*)data;
+        if (evas_object_visible_get(obj))
+          _e_comp_object_autoclose_setup(obj);
+        else
+          evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, 
_e_comp_object_autoclose_show, c);
+        evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, 
_e_comp_object_autoclose_del, c);
         return;
      }
    c->autoclose.obj = obj;

-- 


Reply via email to