Allocate and free the view struct as per discussion.

SVN revision: 19961
This commit is contained in:
David Walter Seikel 2006-01-22 14:18:20 +00:00
parent 4a9f8d3a9a
commit 000417275b
3 changed files with 35 additions and 44 deletions

View File

@ -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

View File

@ -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));

View File

@ -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;