Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_gadcon.c 


Log Message:


and in case an object is deleted clear out the gadcon as well

===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_gadcon.c,v
retrieving revision 1.99
retrieving revision 1.100
diff -u -3 -r1.99 -r1.100
--- e_gadcon.c  11 Jan 2008 07:33:55 -0000      1.99
+++ e_gadcon.c  4 Mar 2008 11:34:31 -0000       1.100
@@ -54,6 +54,8 @@
 static void _e_gadcon_client_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item 
*mi);
 static void _e_gadcon_client_cb_menu_remove(void *data, E_Menu *m, E_Menu_Item 
*mi);
 
+static void _e_gadcon_client_del_hook(void *data, Evas *e, Evas_Object *obj, 
void *event_info);
+
 static Evas_Object *e_gadcon_layout_add(Evas *evas);
 static void e_gadcon_layout_orientation_set(Evas_Object *obj, int horizontal);
 static int e_gadcon_layout_orientation_get(Evas_Object *obj);
@@ -402,9 +404,9 @@
                  gcc->state_info.flags = cf_gcc->state_info.flags;
                  if (gcc->o_frame)
                    e_gadcon_layout_pack_options_set(gcc->o_frame, gcc);
-                 else
+                 else if (gcc->o_base)
                    e_gadcon_layout_pack_options_set(gcc->o_base, gcc);
-
+                 
                  e_gadcon_client_autoscroll_set(gcc, cf_gcc->autoscroll);
                  e_gadcon_client_resizable_set(gcc, cf_gcc->resizable);
                  if (gcc->client_class->func.orient)
@@ -471,7 +473,7 @@
                  gcc->state_info.flags = cf_gcc->state_info.flags;
                  if (gcc->o_frame)
                    e_gadcon_layout_pack_options_set(gcc->o_frame, gcc);
-                 else
+                 else if (gcc->o_base)
                    e_gadcon_layout_pack_options_set(gcc->o_base, gcc);
 
                  if (gcc->client_class->func.orient)
@@ -755,6 +757,9 @@
    gc->clients = evas_list_append(gc->clients, gcc);
    /* This must only be unique during runtime */
    gcc->id = E_GADCON_CLIENT(evas_list_last(gc->clients))->id + 1;
+   if (gcc->o_base)
+     evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_DEL,
+                                   _e_gadcon_client_del_hook, gcc);
    if ((gc->frame_request.func) && (style))
      {
        gcc->o_frame = gc->frame_request.func(gc->frame_request.data, gcc, 
style);
@@ -793,14 +798,17 @@
                                            
_e_gadcon_cb_client_frame_moveresize, gcc);
             evas_object_event_callback_add(gcc->o_frame, 
EVAS_CALLBACK_MOUSE_MOVE,
                                            
_e_gadcon_cb_client_frame_mouse_move, gcc);
-            e_box_pack_end(gcc->o_box, gcc->o_base);
-            e_box_pack_options_set(gcc->o_base,
-                                   1, 1, /* fill */
-                                   1, 1, /* expand */
-                                   0.5, 0.5, /* align */
-                                   0, 0, /* min */
-                                   -1, -1 /* max */
-                                   );
+            if (gcc->o_base)
+              {
+                 e_box_pack_end(gcc->o_box, gcc->o_base);
+                 e_box_pack_options_set(gcc->o_base,
+                                        1, 1, /* fill */
+                                        1, 1, /* expand */
+                                        0.5, 0.5, /* align */
+                                        0, 0, /* min */
+                                        -1, -1 /* max */
+                                        );
+              }
             edje_object_part_swallow(gcc->o_frame, gc->edje.swallow_name, 
gcc->o_box);
             evas_object_show(gcc->o_box);
             evas_object_show(gcc->o_frame);
@@ -808,9 +816,9 @@
      }
    if (gcc->o_frame)
      e_gadcon_layout_pack(gc->o_container, gcc->o_frame);
-   else
+   else if (gcc->o_base)
      e_gadcon_layout_pack(gc->o_container, gcc->o_base);
-   evas_object_show(gcc->o_base);
+   if (gcc->o_base) evas_object_show(gcc->o_base);
    return gcc;
 }
 
@@ -830,7 +838,7 @@
    evas_object_layer_set(gcc->o_control, 100);
    if (gcc->o_frame)
      evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
-   else
+   else if (gcc->o_base)
      evas_object_geometry_get(gcc->o_base, &x, &y, &w, &h);
    evas_object_move(gcc->o_control, x, y);
    evas_object_resize(gcc->o_control, w, h);
@@ -898,7 +906,7 @@
        evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOVE, 
_e_gadcon_cb_client_move, gcc);
        evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_RESIZE, 
_e_gadcon_cb_client_resize, gcc);
      }
-   else
+   else if (gcc->o_base)
      {
        evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_MOVE, 
_e_gadcon_cb_client_move, gcc);
        evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_RESIZE, 
_e_gadcon_cb_client_resize, gcc);
@@ -921,7 +929,7 @@
        evas_object_event_callback_del(gcc->o_frame, EVAS_CALLBACK_MOVE, 
_e_gadcon_cb_client_move);
        evas_object_event_callback_del(gcc->o_frame, EVAS_CALLBACK_RESIZE, 
_e_gadcon_cb_client_resize);
      }
-   else
+   else if (gcc->o_base)
      {
        evas_object_event_callback_del(gcc->o_base, EVAS_CALLBACK_MOVE, 
_e_gadcon_cb_client_move);
        evas_object_event_callback_del(gcc->o_base, EVAS_CALLBACK_RESIZE, 
_e_gadcon_cb_client_resize);
@@ -963,7 +971,7 @@
        e_gadcon_layout_pack(gcc->gadcon->o_container, gcc->o_frame);
        e_gadcon_layout_pack_options_set(gcc->o_frame, gcc);
      }
-   else
+   else if (gcc->o_base)
      {
        e_gadcon_layout_pack(gcc->gadcon->o_container, gcc->o_base);
        e_gadcon_layout_pack_options_set(gcc->o_base, gcc);
@@ -982,7 +990,7 @@
    if (gcc->o_event) evas_object_hide(gcc->o_event);
    if (gcc->o_frame)
      e_gadcon_layout_unpack(gcc->o_frame);
-   else
+   else if (gcc->o_base)
      e_gadcon_layout_unpack(gcc->o_base);
    gcc->hidden = 1;
 }
@@ -999,7 +1007,7 @@
       case E_GADCON_ORIENT_BOTTOM:
        if (gcc->o_frame)
          e_gadcon_layout_pack_size_set(gcc->o_frame, w + gcc->pad.w);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_size_set(gcc->o_base, w);
        break;
       case E_GADCON_ORIENT_VERT:
@@ -1007,7 +1015,7 @@
       case E_GADCON_ORIENT_RIGHT:
        if (gcc->o_frame)
          e_gadcon_layout_pack_size_set(gcc->o_frame, h + gcc->pad.h);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_size_set(gcc->o_base, h);
        break;
       case E_GADCON_ORIENT_FLOAT:
@@ -1035,7 +1043,7 @@
      {
        if (gcc->o_frame)
          e_gadcon_layout_pack_min_size_set(gcc->o_frame, w + gcc->pad.w, h + 
gcc->pad.h);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_min_size_set(gcc->o_base, w, h);
      }
    _e_gadcon_moveresize_handle(gcc);
@@ -1055,7 +1063,7 @@
             e_gadcon_layout_pack_aspect_pad_set(gcc->o_frame, gcc->pad.w, 
gcc->pad.h);
             e_gadcon_layout_pack_aspect_set(gcc->o_frame, w, h);
          }
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_aspect_set(gcc->o_base, w, h);
      }
    _e_gadcon_moveresize_handle(gcc);
@@ -1076,7 +1084,7 @@
             e_gadcon_layout_pack_aspect_set(gcc->o_frame, 0, 0);
             e_gadcon_layout_pack_min_size_set(gcc->o_frame, 0, 0);
          }
-       else
+       else if (gcc->o_base)
          {
             e_gadcon_layout_pack_aspect_set(gcc->o_base, 0, 0);
             e_gadcon_layout_pack_min_size_set(gcc->o_base, 0, 0);
@@ -1090,7 +1098,7 @@
             e_gadcon_layout_pack_aspect_set(gcc->o_frame, gcc->aspect.w, 
gcc->aspect.h);
             e_gadcon_layout_pack_min_size_set(gcc->o_frame, gcc->min.w, 
gcc->min.h);
          }
-       else
+       else if (gcc->o_base)
          {
             e_gadcon_layout_pack_min_size_set(gcc->o_base, gcc->min.w, 
gcc->min.h);
             e_gadcon_layout_pack_aspect_set(gcc->o_base, gcc->aspect.w, 
gcc->aspect.h);
@@ -1113,7 +1121,7 @@
             e_gadcon_layout_pack_aspect_set(gcc->o_frame, 0, 0);
             e_gadcon_layout_pack_min_size_set(gcc->o_frame, 0, 0);
          }
-       else
+       else if (gcc->o_base)
          {
             e_gadcon_layout_pack_min_size_set(gcc->o_base, 0, 0);
             e_gadcon_layout_pack_aspect_set(gcc->o_base, 0, 0);
@@ -1127,7 +1135,7 @@
             e_gadcon_layout_pack_aspect_set(gcc->o_frame, gcc->aspect.w, 
gcc->aspect.h);
             e_gadcon_layout_pack_min_size_set(gcc->o_frame, gcc->min.w, 
gcc->min.h);
          }
-       else
+       else if (gcc->o_base)
          {
             e_gadcon_layout_pack_min_size_set(gcc->o_base, gcc->min.w, 
gcc->min.h);
             e_gadcon_layout_pack_aspect_set(gcc->o_base, gcc->aspect.w, 
gcc->aspect.h);
@@ -1143,8 +1151,9 @@
    E_OBJECT_CHECK(gcc);
    E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
    if (!e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &gx, &gy, NULL, NULL)) 
return 0;
-
-   evas_object_geometry_get(gcc->o_base, x, y, w, h);
+   
+   if (gcc->o_base)
+     evas_object_geometry_get(gcc->o_base, x, y, w, h);
    if (x) *x += gx;
    if (y) *y += gy;
 
@@ -1240,7 +1249,7 @@
    E_OBJECT_TYPE_CHECK(gcc, E_GADCON_CLIENT_TYPE);
    if (gcc->o_frame)
      evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN, 
_e_gadcon_client_cb_mouse_down, gcc);
-   else
+   else if (gcc->o_base)
      evas_object_event_callback_add(gcc->o_base, EVAS_CALLBACK_MOUSE_DOWN, 
_e_gadcon_client_cb_mouse_down, gcc);
 }
 
@@ -1300,6 +1309,10 @@
 static void
 _e_gadcon_client_free(E_Gadcon_Client *gcc)
 {
+   if (gcc->o_base)
+     evas_object_event_callback_del(gcc->o_base,
+                                   EVAS_CALLBACK_DEL,
+                                   _e_gadcon_client_del_hook);
    if (gcc->menu)
      {
         e_menu_post_deactivate_callback_set(gcc->menu, NULL, NULL);
@@ -1337,13 +1350,14 @@
               h = (w * gcc->aspect.h) / gcc->aspect.w;
          }
      }
-   e_box_pack_options_set(gcc->o_base,
-                         1, 1, /* fill */
-                         1, 1, /* expand */
-                         0.5, 0.5, /* align */
-                         w, h, /* min */
-                         w, h /* max */
-                         );
+   if (gcc->o_base)
+     e_box_pack_options_set(gcc->o_base,
+                           1, 1, /* fill */
+                           1, 1, /* expand */
+                           0.5, 0.5, /* align */
+                           w, h, /* min */
+                           w, h /* max */
+                           );
 }
 
 static int
@@ -1483,7 +1497,7 @@
      {
        if (gcc->o_frame)
          evas_object_geometry_get(gcc->o_frame, &cx, &cy, &cw, &ch);
-       else
+       else if (gcc->o_base)
          evas_object_geometry_get(gcc->o_base, &cx, &cy, &cw, &ch);
        if (E_INSIDE(x, y, cx, cy, cw, ch)) return;
      }
@@ -1500,7 +1514,7 @@
        if (gcc2->hidden) continue;
        if (gcc2->o_frame)
          evas_object_geometry_get(gcc2->o_frame, &cx, &cy, &cw, &ch);
-       else
+       else if (gcc2->o_base)
          evas_object_geometry_get(gcc2->o_base, &cx, &cy, &cw, &ch);
        if (e_gadcon_layout_orientation_get(gc->o_container))
          {
@@ -1775,14 +1789,14 @@
 
    if (gcc->o_frame)
      evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
-   else
+   else if (gcc->o_base)
      evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
 
    if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
      {
        if (gcc->o_frame)
          e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos + x, 
w);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos + x, w);
 
        gcc->config.size = w;
@@ -1793,7 +1807,7 @@
      {
        if (gcc->o_frame)
          e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos + y, 
h);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos + y, h);
 
        gcc->config.size = h;
@@ -1851,7 +1865,7 @@
 
    if (gcc->o_frame)
      evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
-   else
+   else if (gcc->o_base)
      evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
 
    _e_gadcon_client_current_position_sync(gcc);
@@ -1875,7 +1889,7 @@
      {
        if (gcc->o_frame) 
          e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos + x, w 
- x);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos + x, w 
- x);
        evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
        gcc->config.res = w;
@@ -1884,7 +1898,7 @@
      {
        if (gcc->o_frame)
          e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos + y, h 
- y);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos + y, h 
- y);
        evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
        gcc->config.res = h; 
@@ -1922,7 +1936,7 @@
 
    if (gcc->o_frame)
      evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
-   else
+   else if (gcc->o_base)
      evas_object_geometry_get(gcc->o_base, NULL, NULL, &w, &h);
 
    _e_gadcon_client_current_position_sync(gcc);
@@ -1946,7 +1960,7 @@
      {
        if (gcc->o_frame)
          e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos, w + 
x);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos, w + x);
        evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
        gcc->config.res = w;
@@ -1955,7 +1969,7 @@
      {
        if (gcc->o_frame)
          e_gadcon_layout_pack_request_set(gcc->o_frame, gcc->config.pos, h + 
y);
-       else
+       else if (gcc->o_base)
          e_gadcon_layout_pack_request_set(gcc->o_base, gcc->config.pos, h + y);
        evas_object_geometry_get(gcc->gadcon->o_container, NULL, NULL, &w, &h);
        gcc->config.res = h;
@@ -2017,10 +2031,13 @@
        e_gadcon_client_show(gcc);
 
        o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
-       if (e_gadcon_layout_orientation_get(gc->o_container))
-         e_gadcon_layout_pack_request_set(o, gcc->config.pos, 
gcc->config.size);
-       else
-         e_gadcon_layout_pack_request_set(o, gcc->config.pos, 
gcc->config.size);
+       if (o)
+         {
+            if (e_gadcon_layout_orientation_get(gc->o_container))
+              e_gadcon_layout_pack_request_set(o, gcc->config.pos, 
gcc->config.size);
+            else
+              e_gadcon_layout_pack_request_set(o, gcc->config.pos, 
gcc->config.size);
+         }
        gcc->state_info.resist = 1;
      }
    else if (ev->data)
@@ -2052,7 +2069,7 @@
                  new_gcc->state_info.flags = gcc->state_info.flags;
                  if (new_gcc->o_frame)
                    e_gadcon_layout_pack_options_set(new_gcc->o_frame, new_gcc);
-                 else
+                 else if (new_gcc->o_base)
                    e_gadcon_layout_pack_options_set(new_gcc->o_base, new_gcc);
 
                  e_gadcon_client_autoscroll_set(new_gcc, gcc->autoscroll);
@@ -2106,10 +2123,13 @@
        _e_gadcon_client_inject(gc, gcc, ev->x + dx, ev->y + dy);
 
        o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
-       if (e_gadcon_layout_orientation_get(gc->o_container))
-         e_gadcon_layout_pack_request_set(o, gcc->config.pos, 
gcc->config.size);
-       else
-         e_gadcon_layout_pack_request_set(o, gcc->config.pos, 
gcc->config.size);
+       if (o)
+         {
+            if (e_gadcon_layout_orientation_get(gc->o_container))
+              e_gadcon_layout_pack_request_set(o, gcc->config.pos, 
gcc->config.size);
+            else
+              e_gadcon_layout_pack_request_set(o, gcc->config.pos, 
gcc->config.size);
+         }
        e_gadcon_layout_thaw(gc->o_container);
      }
 }
@@ -2298,6 +2318,21 @@
    e_config_save_queue();
 }
 
+static void
+_e_gadcon_client_del_hook(void *data, Evas *e, Evas_Object *obj, void 
*event_info)
+{
+   E_Gadcon_Client *gcc;
+
+   gcc = data;
+   gcc->o_base = NULL;
+   if (gcc->o_frame)
+     {
+       evas_object_del(gcc->o_frame);
+       gcc->o_frame = NULL;
+     }
+   e_object_del(E_OBJECT(gcc));
+}
+
 /* a smart object JUST for gadcon */
 
 typedef struct _E_Gadcon_Layout_Item  E_Gadcon_Layout_Item;
@@ -2704,7 +2739,7 @@
    evas_object_clip_set(obj, sd->clip);
    evas_object_smart_member_add(obj, bi->sd->obj);
    evas_object_data_set(obj, "e_gadcon_layout_data", bi);
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_FREE,
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
                                  _e_gadcon_layout_smart_item_del_hook, NULL);
    if ((!evas_object_visible_get(sd->clip)) &&
        (evas_object_visible_get(sd->obj)))
@@ -2727,7 +2762,7 @@
          evas_object_hide(bi->sd->clip);
      }
    evas_object_event_callback_del(obj,
-                                 EVAS_CALLBACK_FREE,
+                                 EVAS_CALLBACK_DEL,
                                  _e_gadcon_layout_smart_item_del_hook);
    evas_object_smart_member_del(obj);
    evas_object_clip_unset(obj);
@@ -3474,8 +3509,11 @@
    Evas_Object *o;
 
    o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
-   bi = evas_object_data_get(o, "e_gadcon_layout_data");
-   if (!bi) return;
+   if (o)
+     {
+       bi = evas_object_data_get(o, "e_gadcon_layout_data");
+       if (!bi) return;
+     }
    
    gcc->state_info.prev_pos = gcc->config.pos;
    gcc->state_info.prev_size = gcc->config.size;



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to