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