From 000417275b7ea9dbd09ec4314bfef115e4ac6024 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 22 Jan 2006 14:18:20 +0000 Subject: [PATCH] Allocate and free the view struct as per discussion. SVN revision: 19961 --- src/bin/e_apps_error.c | 23 +++++++++--------- src/bin/e_config_dialog.c | 50 +++++++++++++++++---------------------- src/bin/e_config_dialog.h | 6 +---- 3 files changed, 35 insertions(+), 44 deletions(-) diff --git a/src/bin/e_apps_error.c b/src/bin/e_apps_error.c index d0c4814fe..4475645f7 100644 --- a/src/bin/e_apps_error.c +++ b/src/bin/e_apps_error.c @@ -24,18 +24,19 @@ _e_app_error_dialog(E_Container *con, E_App_Autopsy *app) E_Config_Dialog *cfd; E_Config_Dialog_View *v; - v = E_NEW(E_Config_Dialog_View, 1); /* FIXME: Currenly this never gets free'd, awaiting the outcome of mailing list discussion. */ - /* Dialog Methods */ - v->create_cfdata = _e_app_error_dialog_create_data; - v->free_cfdata = _e_app_error_dialog_free_data; -// v->basic.apply_cfdata = NULL; - v->basic.create_widgets = _e_app_error_dialog_basic_create_widgets; -// v->advanced.apply_cfdata = NULL; - v->advanced.create_widgets = _e_app_error_dialog_advanced_create_widgets; + v = E_NEW(E_Config_Dialog_View, 1); /* This gets freed by e_config_dialog. */ + if (v) + { + /* Dialog Methods */ + v->create_cfdata = _e_app_error_dialog_create_data; + v->free_cfdata = _e_app_error_dialog_free_data; + v->basic.create_widgets = _e_app_error_dialog_basic_create_widgets; + v->advanced.create_widgets = _e_app_error_dialog_advanced_create_widgets; - /* Create The Dialog */ - cfd = e_config_dialog_new(con, _("Run error, wtf? That sux."), NULL, 0, v, app); - app->error_dialog = cfd; + /* Create The Dialog */ + cfd = e_config_dialog_new(con, _("Run error, wtf? That sux."), NULL, 0, v, app); + app->error_dialog = cfd; + } } static void diff --git a/src/bin/e_config_dialog.c b/src/bin/e_config_dialog.c index e3f0f07b1..a4b835835 100644 --- a/src/bin/e_config_dialog.c +++ b/src/bin/e_config_dialog.c @@ -25,14 +25,7 @@ e_config_dialog_new(E_Container *con, char *title, char *icon, int icon_size, E_ cfd = E_OBJECT_ALLOC(E_Config_Dialog, E_CONFIG_DIALOG_TYPE, _e_config_dialog_free); - cfd->view = *view; - /* Seems that every user of this allocates view it on the stack and doesn't clear it, - * so I can't rely on this being NULL. I currently set it to NULL in e_config_dialog_new() - * and if you want to use it, set it in create_widgets(); - * I suspect that allocating a structure on the stack that lives beyond the function - * call is just asking for trouble. - */ - cfd->view.close_cfdata = NULL; + cfd->view = view; cfd->con = con; cfd->title = evas_stringshare_add(title); if (icon) @@ -43,7 +36,7 @@ e_config_dialog_new(E_Container *con, char *title, char *icon, int icon_size, E_ cfd->data = data; cfd->hide_buttons = 1; - if ((cfd->view.basic.apply_cfdata) || (cfd->view.advanced.apply_cfdata)) + if ((cfd->view->basic.apply_cfdata) || (cfd->view->advanced.apply_cfdata)) cfd->hide_buttons = 0; _e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_BASIC); @@ -60,7 +53,7 @@ _e_config_dialog_free(E_Config_Dialog *cfd) if (cfd->icon) evas_stringshare_del(cfd->icon); if (cfd->cfdata) { - cfd->view.free_cfdata(cfd, cfd->cfdata); + cfd->view->free_cfdata(cfd, cfd->cfdata); cfd->cfdata = NULL; } if (cfd->dia) @@ -69,6 +62,7 @@ _e_config_dialog_free(E_Config_Dialog *cfd) e_object_del(E_OBJECT(cfd->dia)); cfd->dia = NULL; } + E_FREE(cfd->view); free(cfd); } @@ -87,14 +81,14 @@ _e_config_dialog_go(E_Config_Dialog *cfd, E_Config_Dialog_CFData_Type type) e_dialog_title_set(cfd->dia, cfd->title); if (cfd->icon) e_dialog_icon_set(cfd->dia, cfd->icon, cfd->icon_size); - if (!cfd->cfdata) cfd->cfdata = cfd->view.create_cfdata(cfd); + if (!cfd->cfdata) cfd->cfdata = cfd->view->create_cfdata(cfd); if (type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC) { - if (cfd->view.advanced.create_widgets) + if (cfd->view->advanced.create_widgets) { o = e_widget_list_add(e_win_evas_get(cfd->dia->win), 0, 0); - ob = cfd->view.basic.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata); + ob = cfd->view->basic.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata); e_widget_list_object_append(o, ob, 1, 1, 0.0); ob = e_widget_button_add(e_win_evas_get(cfd->dia->win), _("Advanced"), "widget/new_dialog", @@ -102,14 +96,14 @@ _e_config_dialog_go(E_Config_Dialog *cfd, E_Config_Dialog_CFData_Type type) e_widget_list_object_append(o, ob, 0, 0, 1.0); } else - o = cfd->view.basic.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata); + o = cfd->view->basic.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata); } else { - if (cfd->view.basic.create_widgets) + if (cfd->view->basic.create_widgets) { o = e_widget_list_add(e_win_evas_get(cfd->dia->win), 0, 0); - ob = cfd->view.advanced.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata); + ob = cfd->view->advanced.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata); e_widget_list_object_append(o, ob, 1, 1, 0.0); ob = e_widget_button_add(e_win_evas_get(cfd->dia->win), _("Basic"), "widget/new_dialog", @@ -117,7 +111,7 @@ _e_config_dialog_go(E_Config_Dialog *cfd, E_Config_Dialog_CFData_Type type) e_widget_list_object_append(o, ob, 0, 0, 1.0); } else - o = cfd->view.advanced.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata); + o = cfd->view->advanced.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata); } e_widget_min_size_get(o, &mw, &mh); @@ -167,7 +161,7 @@ _e_config_dialog_cb_dialog_del(void *obj) { E_Dialog *dia; E_Config_Dialog *cfd; - + dia = obj; cfd = dia->data; cfd->dia = NULL; @@ -183,13 +177,13 @@ _e_config_dialog_cb_ok(void *data, E_Dialog *dia) cfd = dia->data; if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC) { - if (cfd->view.basic.apply_cfdata) - ok = cfd->view.basic.apply_cfdata(cfd, cfd->cfdata); + if (cfd->view->basic.apply_cfdata) + ok = cfd->view->basic.apply_cfdata(cfd, cfd->cfdata); } else { - if (cfd->view.advanced.apply_cfdata) - ok = cfd->view.advanced.apply_cfdata(cfd, cfd->cfdata); + if (cfd->view->advanced.apply_cfdata) + ok = cfd->view->advanced.apply_cfdata(cfd, cfd->cfdata); } if (ok) e_object_del(E_OBJECT(cfd)); } @@ -203,13 +197,13 @@ _e_config_dialog_cb_apply(void *data, E_Dialog *dia) cfd = dia->data; if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC) { - if (cfd->view.basic.apply_cfdata) - ok = cfd->view.basic.apply_cfdata(cfd, cfd->cfdata); + if (cfd->view->basic.apply_cfdata) + ok = cfd->view->basic.apply_cfdata(cfd, cfd->cfdata); } else { - if (cfd->view.advanced.apply_cfdata) - ok = cfd->view.advanced.apply_cfdata(cfd, cfd->cfdata); + if (cfd->view->advanced.apply_cfdata) + ok = cfd->view->advanced.apply_cfdata(cfd, cfd->cfdata); } if ((ok) && (!cfd->hide_buttons)) { @@ -256,8 +250,8 @@ _e_config_dialog_cb_close(void *data, E_Dialog *dia) int ok = 1; cfd = dia->data; - if (cfd->view.close_cfdata) - ok = cfd->view.close_cfdata(cfd, cfd->cfdata); + if (cfd->view->close_cfdata) + ok = cfd->view->close_cfdata(cfd, cfd->cfdata); if (ok) e_object_del(E_OBJECT(dia)); diff --git a/src/bin/e_config_dialog.h b/src/bin/e_config_dialog.h index 23f79650b..c54ae5355 100644 --- a/src/bin/e_config_dialog.h +++ b/src/bin/e_config_dialog.h @@ -23,10 +23,6 @@ struct _E_Config_Dialog_View { void *(*create_cfdata) (E_Config_Dialog *cfd); void (*free_cfdata) (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); - /* Seems that every user of this structure allocates it on the stack and doesn't clear it, - * so I can't rely on this being NULL. I currently set it to NULL in e_config_dialog_new() - * and if you want to use it, set it in create_widgets(); - */ int (*close_cfdata) (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); struct { int (*apply_cfdata) (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); @@ -39,7 +35,7 @@ struct _E_Config_Dialog E_Object e_obj_inherit; E_Config_Dialog_CFData_Type view_type; - E_Config_Dialog_View view; + E_Config_Dialog_View *view; E_Config_Dialog_Data *cfdata; E_Container *con; char *title;