Hmmm...this patch is screwed. Don't know how that happened. Here tis
again.

metrics

On Wed, Oct 25, 2006 at 03:27:43PM +1000, Metrics wrote:
> Patch attached to fix a segv lurking in the system actions dialog box
> that shows up during suspend/resume/reboot etc.
> 
> Problem was that the callback that triggers to delete the window would
> still try and perform the delete on the window with an invalid pointer
> if the window was closed via some other means.  To work around this, a
> delete callback was implemented for e_obj_dialog, and it is used to NULL
> the pointer.
> 
> metrics
Index: e_obj_dialog.c
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_obj_dialog.c,v
retrieving revision 1.2
diff -u -r1.2 e_obj_dialog.c
--- e_obj_dialog.c      21 Sep 2006 20:07:02 -0000      1.2
+++ e_obj_dialog.c      25 Oct 2006 06:39:42 -0000
@@ -45,11 +45,18 @@
    od->bg_object = o;
    
    e_win_centered_set(od->win, 1);
+   od->cb_delete = NULL;
    
    return od;
 }
 
 EAPI void
+e_obj_dialog_cb_delete_set(E_Obj_Dialog *od, void (*func)(E_Obj_Dialog *od))
+{
+   od->cb_delete = func;
+}
+
+EAPI void
 e_obj_dialog_icon_set(E_Obj_Dialog *od, char *icon)
 {
    E_OBJECT_CHECK(od);
@@ -116,6 +123,8 @@
    E_Obj_Dialog *od;
    
    od = win->data;
+   if (od->cb_delete)
+     od->cb_delete(od);
    e_object_del(E_OBJECT(od));
 }
 
@@ -125,5 +134,7 @@
    E_Obj_Dialog *od;
    
    od = data;
+   if (od->cb_delete)
+     od->cb_delete(od);
    e_object_del(E_OBJECT(od));
 }
Index: e_obj_dialog.h
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_obj_dialog.h,v
retrieving revision 1.1
diff -u -r1.1 e_obj_dialog.h
--- e_obj_dialog.h      10 Sep 2006 04:51:07 -0000      1.1
+++ e_obj_dialog.h      25 Oct 2006 06:39:42 -0000
@@ -18,6 +18,7 @@
    E_Win               *win;
    Evas_Object         *bg_object;
    void                *data;
+   void                       (*cb_delete)(E_Obj_Dialog *od);
 };
 
 EAPI E_Obj_Dialog   *e_obj_dialog_new(E_Container *con, char *title, char 
*class_name, char *class_class);
@@ -25,6 +26,7 @@
 EAPI void            e_obj_dialog_show(E_Obj_Dialog *od);
 EAPI void            e_obj_dialog_obj_part_text_set(E_Obj_Dialog *od, char 
*part, char *text);
 EAPI void            e_obj_dialog_obj_theme_set(E_Obj_Dialog *od, char 
*theme_cat, char *theme_obj);
+EAPI void           e_obj_dialog_cb_delete_set(E_Obj_Dialog *od, void 
(*func)(E_Obj_Dialog *od));
     
 #endif
 #endif
Index: e_sys.c
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_sys.c,v
retrieving revision 1.6
diff -u -r1.6 e_sys.c
--- e_sys.c     21 Oct 2006 11:19:40 -0000      1.6
+++ e_sys.c     25 Oct 2006 06:40:02 -0000
@@ -15,6 +15,7 @@
 static void _e_sys_current_action(void);
 static void _e_sys_action_failed(void);
 static int _e_sys_action_do(E_Sys_Action a, char *param);
+static void _e_sys_dialog_cb_delete(E_Obj_Dialog * od);
 
 static Ecore_Event_Handler *_e_sys_exe_exit_handler = NULL;
 static Ecore_Exe *_e_sys_halt_check_exe = NULL;
@@ -482,6 +483,7 @@
             e_obj_dialog_show(od);
             e_obj_dialog_icon_set(od, "enlightenment/halt");
             if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
+            e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
             _e_sys_dialog = od;
             /* FIXME: display halt status */
          }
@@ -508,6 +510,7 @@
             e_obj_dialog_show(od);
             e_obj_dialog_icon_set(od, "enlightenment/reboot");
             if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
+            e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
             _e_sys_dialog = od;
             /* FIXME: display reboot status */
          }
@@ -533,6 +536,7 @@
             e_obj_dialog_show(od);
             e_obj_dialog_icon_set(od, "enlightenment/suspend");
             if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
+            e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
             _e_sys_dialog = od;
             /* FIXME: display suspend status */
          }
@@ -559,6 +563,7 @@
             e_obj_dialog_icon_set(od, "enlightenment/hibernate");
             if (_e_sys_dialog) e_object_del(E_OBJECT(_e_sys_dialog));
             _e_sys_dialog = od;
+            e_obj_dialog_cb_delete_set(od, _e_sys_dialog_cb_delete);
             /* FIXME: display hibernate status */
          }
        break;
@@ -567,3 +572,11 @@
      }
    return 1;
 }
+
+static void _e_sys_dialog_cb_delete(E_Obj_Dialog * od)
+{
+   /* If we don't NULL out the _e_sys_dialog, then the
+    * ECORE_EXE_EVENT_DEL callback will trigger and segv if the window
+    * is deleted in some other way. */
+   _e_sys_dialog = NULL;
+}
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to