From d46a81efa83148a8834ec6cca8c5f955bc5cf6ce Mon Sep 17 00:00:00 2001 From: Jaime Thomas Date: Fri, 6 Feb 2009 04:03:13 +0000 Subject: [PATCH] Fix some crashes and a bunch of memory leaks/errors. There are still a few memory leaks originating deep within ewl somewhere. Also, if you don't open the config_inwin before closing the program, there are some errors. --- ecdb/trunk/src/ecdb_burn_data_gui.c | 40 +++++++++++++++++----- ecdb/trunk/src/ecdb_burn_image_gui.c | 31 ++++++++++++----- ecdb/trunk/src/ecdb_erase_gui.c | 14 ++++++++ ecdb/trunk/src/ecdb_gui.c | 51 +++++++++++++++++++++++----- ecdb/trunk/src/ecdb_projects.c | 11 ------ ecdb/trunk/src/ecdb_widgets.c | 35 ++++++++++++++++--- ecdb/trunk/src/ecdb_widgets.h | 1 + 7 files changed, 144 insertions(+), 39 deletions(-) diff --git a/ecdb/trunk/src/ecdb_burn_data_gui.c b/ecdb/trunk/src/ecdb_burn_data_gui.c index dc9c919..279bbf0 100644 --- a/ecdb/trunk/src/ecdb_burn_data_gui.c +++ b/ecdb/trunk/src/ecdb_burn_data_gui.c @@ -7,6 +7,7 @@ static void _button_cb_return(void *data, Evas_Object *obj, static void _button_cb_begin(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _page_del(void *data, Evas *e, Evas_Object *obj, void *ev); static void _combo_cb_clicked(void *data, Evas_Object *obj, void *event_info); static int _update_capacity(void *data, int type, void *ev_data); @@ -37,6 +38,21 @@ static void _page_hide_finished(void *data, Evas_Object *o, const char *emission, const char *source); +static void +_page_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *ev __UNUSED__) +{ + Ecdb_Data_Project *proj; + Ecdb_Source *src; + + src = data; + proj = evas_object_data_get(obj, "proj"); + if (proj) + ecdb_data_project_destroy(proj); + + if (src) + ecdb_source_destroy(src); +} + static void _page_hide_finished(void *data, Evas_Object *o, const char *emission __UNUSED__, @@ -178,26 +194,29 @@ _button_cb_begin(void *data, Evas_Object *obj __UNUSED__, } static void -_combo_cb_clicked(void *data, Evas_Object *obj, void *event_info) +_combo_cb_clicked(void *data, Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) { Evas_Object *b; Ecdb_Burn_Project *proj; Ecdb_Project *base_proj; - Ecdb_Page *page; int sel, i, num_speeds, speed; char buf[1024]; - page = data; - if (!page) + proj = data; + if (!proj) return; - proj = evas_object_data_get(page->data, "proj"); base_proj = ECDB_PROJECT(proj); sel = ecdb_combo_selected_get(base_proj->drive_combo); if (sel < 0) return; base_proj->drive = eina_list_nth(em->drives, sel); + + /* Don't keep adding items to the combo if the drive hasn't changed */ + if (base_proj->drive == ecdb_combo_data_get(proj->speed_combo)); + // Update the capacity here, as our capacity could change with the drive ecore_event_add(ECDB_FILELIST_SIZE_CHANGED, NULL, NULL, NULL); num_speeds = base_proj->drive->write_speeds[0]; @@ -381,7 +400,7 @@ _apply_clicked(void *data, Evas_Object *obj, void *event_info) static void _proj_name(void *data, Evas *e, Evas_Object *obj, void *event_info) { - const char *name; + char *name; Ecdb_Data_Project *proj; proj = data; @@ -389,7 +408,7 @@ _proj_name(void *data, Evas *e, Evas_Object *obj, void *event_info) if (proj->volume_id) free(proj->volume_id); - proj->volume_id = strdup(name); + proj->volume_id = name; } static void @@ -510,6 +529,11 @@ ecdb_burn_data_page_show(Ecdb_Page *page) src = ecdb_source_new(); ewl_widget_data_set(proj->filelist, "source", src); + /* Add a delete callback so we can correctly free data that won't get + * handled automatically + */ + evas_object_event_callback_add(page->data, EVAS_CALLBACK_DEL, _page_del, + src); edje_object_part_geometry_get(page->data, "ecdb/burn_data/filelist", &x, &y, &w, &h); @@ -527,7 +551,7 @@ ecdb_burn_data_page_show(Ecdb_Page *page) page); evas_object_show(proj->capacity); - t = ecdb_config_inwin_add(page->data, NULL); + t = ecdb_config_inwin_add(bp->ret, NULL); b = ecdb_check_add(t, NULL); ecdb_check_label_set(b, "Use Joliet"); diff --git a/ecdb/trunk/src/ecdb_burn_image_gui.c b/ecdb/trunk/src/ecdb_burn_image_gui.c index 516187c..17a7dbb 100644 --- a/ecdb/trunk/src/ecdb_burn_image_gui.c +++ b/ecdb/trunk/src/ecdb_burn_image_gui.c @@ -7,12 +7,22 @@ static void _button_cb_return(void *data, Evas_Object *obj, static void _button_cb_begin(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _combo_cb_clicked(void *data, Evas_Object *obj, - const char *emission, - const char *source); +static void _combo_cb_clicked(void *data, Evas_Object *obj, void *event_info); static void _page_hide_finished(void *data, Evas_Object *o, const char *emission, const char *source); +static void _page_del(void *data, Evas *e, Evas_Object *obj, void *ev); + +static void +_page_del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, + void *ev __UNUSED__) +{ + Ecdb_Image_Project *proj; + + proj = evas_object_data_get(obj, "proj"); + if (proj) + ecdb_image_project_destroy(proj); +} static void _page_hide_finished(void *data, Evas_Object *o, const char *emission __UNUSED__, @@ -134,8 +144,7 @@ _button_cb_begin(void *data, Evas_Object *obj __UNUSED__, static void _combo_cb_clicked(void *data, Evas_Object *obj __UNUSED__, - const char *emission __UNUSED__, - const char *source __UNUSED__) + void *event_info __UNUSED__) { Evas_Object *b; Ecdb_Burn_Project *bp; @@ -148,7 +157,12 @@ _combo_cb_clicked(void *data, Evas_Object *obj __UNUSED__, if (sel < 0) return; - drive = eina_list_nth(em->drives, sel); + ECDB_PROJECT(bp)->drive = drive = eina_list_nth(em->drives, sel); + + /* Don't keep adding items to the combo if the drive hasn't changed */ + if (drive == ecdb_combo_data_get(bp->speed_combo)) + return; + num_speeds = drive->write_speeds[0]; ecdb_combo_data_set(bp->speed_combo, drive); for (i = 1; i < num_speeds; i++) @@ -199,6 +213,8 @@ ecdb_burn_image_page_show(Ecdb_Page *page) evas_object_move(page->gui, x, y); evas_object_resize(page->image, w, h); edje_object_part_swallow(page->gui, "action_area", page->image); + evas_object_event_callback_add(page->image, EVAS_CALLBACK_DEL, _page_del, + page); edje_object_signal_callback_add(page->image, "hide,finished", "burn_image_page", _page_hide_finished, page->gui); @@ -245,8 +261,7 @@ ecdb_burn_image_page_show(Ecdb_Page *page) { b = ecdb_combo_item_add(bp->drive_combo, NULL); ecdb_combo_item_label_set(b, drive->product); - edje_object_signal_callback_add(b, "mouse,clicked,1", "*", - _combo_cb_clicked, proj); + evas_object_smart_callback_add(b, "clicked", _combo_cb_clicked, proj); ecdb_combo_append(bp->drive_combo, b); evas_object_show(b); } diff --git a/ecdb/trunk/src/ecdb_erase_gui.c b/ecdb/trunk/src/ecdb_erase_gui.c index 04733dc..7f0bf2b 100644 --- a/ecdb/trunk/src/ecdb_erase_gui.c +++ b/ecdb/trunk/src/ecdb_erase_gui.c @@ -8,6 +8,18 @@ static void _button_cb_begin(void *data, Evas_Object *o, const char *emission, static void _page_hide_finished(void *data, Evas_Object *o, const char *emission, const char *source); +static void _page_del(void *data, Evas *e, Evas_Object *obj, void *ev); + +static void +_page_del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, + void *ev __UNUSED__) +{ + Ecdb_Erase_Project *proj; + + proj = evas_object_data_get(obj, "proj"); + if (proj) + ecdb_erase_project_destroy(proj); +} static void _page_hide_finished(void *data, Evas_Object *o, @@ -107,6 +119,8 @@ ecdb_erase_page_show(Ecdb_Page *page) evas_object_move(page->erase, x, y); evas_object_resize(page->erase, w, h); edje_object_part_swallow(page->gui, "action_area", page->erase); + evas_object_event_callback_add(page->erase, EVAS_CALLBACK_DEL, _page_del, + page); evas_object_show(page->erase); proj = ecdb_erase_project_new(); diff --git a/ecdb/trunk/src/ecdb_gui.c b/ecdb/trunk/src/ecdb_gui.c index abd3890..0d0684d 100644 --- a/ecdb/trunk/src/ecdb_gui.c +++ b/ecdb/trunk/src/ecdb_gui.c @@ -10,6 +10,35 @@ static void ecdb_filelist_focus_handle(int action, Evas_Object *fl, static void ecdb_welcome_page_hide_finished(void *data, Evas_Object *o, const char *emission, const char *source); +static void _page_del(void *data, Evas *e, Evas_Object *obj, void *ev); +static void _filelist_del(Ewl_Widget *w, void *ev_data, void *data); + +static void +_filelist_del(Ewl_Widget *w, void *ev_data __UNUSED__, void *data __UNUSED__) +{ + Ewl_Filelist_Filter *f; + + f = ewl_filelist_filter_get(EWL_FILELIST(w)); + if (f) + { + if (f->extension) + free(f->extension); + free(f); + } +} + +static void +_page_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, + void *ev __UNUSED__) +{ + Ecdb_Page *page; + + page = data; + if (!page) + return; + + free(page); +} /* XXX These need to be fixed when Ecdb_Page become the swallow, * whereas it is the actual gui as well @@ -245,6 +274,8 @@ ecdb_create_main_gui(void) evas_object_resize(em->page->gui, mw, mh); ecore_evas_resize(em->main_win_ee, mw, mh); ecore_evas_size_min_set(em->main_win_ee, mw, mh); + evas_object_event_callback_add(em->page->gui, EVAS_CALLBACK_DEL, _page_del, + em->page); evas_object_move(em->page->gui, 0, 0); evas_object_show(em->page->gui); @@ -337,16 +368,18 @@ ecdb_handle_typebuf(Evas_Object *gui, Ewl_Widget *fl) { filter = calloc(sizeof(Ewl_Filelist_Filter), 1); } - - if (filter->extension) + else { - if (strcmp(filter->extension, ext)) + if (filter->extension) { - FREE(filter->extension); - } - else - { - return; + if (strcmp(filter->extension, ext)) + { + FREE(filter->extension); + } + else + { + return; + } } } @@ -455,6 +488,8 @@ ecdb_filelist_show(Ecdb_Page *page) filelist = ewl_filelist_new(); ewl_container_child_append(EWL_CONTAINER(embed), filelist); + ewl_callback_prepend(EWL_WIDGET(filelist), EWL_CALLBACK_DESTROY, + _filelist_del, NULL); ewl_filelist_directory_set(EWL_FILELIST(filelist), getenv("HOME")); ewl_widget_show(filelist); diff --git a/ecdb/trunk/src/ecdb_projects.c b/ecdb/trunk/src/ecdb_projects.c index 4a61cf0..b82f22d 100644 --- a/ecdb/trunk/src/ecdb_projects.c +++ b/ecdb/trunk/src/ecdb_projects.c @@ -36,12 +36,8 @@ ecdb_project_init(Ecdb_Project *proj) void ecdb_project_destroy(Ecdb_Project *proj) { - FREE(proj->drive); if (proj->ev_handler) ecore_event_handler_del(proj->ev_handler); if (proj->pipe) ecore_pipe_del(proj->pipe); - if (proj->ret) evas_object_del(proj->ret); - if (proj->begin) evas_object_del(proj->begin); - if (proj->drive_combo) evas_object_del(proj->drive_combo); printf("Destroying base project\n"); } @@ -91,7 +87,6 @@ void ecdb_burn_project_destroy(Ecdb_Burn_Project *proj) { if (proj->files) ecdb_source_destroy(proj->files); - if (proj->speed_combo) evas_object_del(proj->speed_combo); ecdb_project_destroy(ECDB_PROJECT(proj)); printf("Destroying burn project\n"); } @@ -135,7 +130,6 @@ ecdb_erase_project_init(Ecdb_Erase_Project *proj) void ecdb_erase_project_destroy(Ecdb_Erase_Project *proj) { - if (proj->speed) evas_object_del(proj->speed); ecdb_project_destroy(ECDB_PROJECT(proj)); FREE(proj); } @@ -217,10 +211,6 @@ ecdb_data_project_init(Ecdb_Data_Project *proj) void ecdb_data_project_destroy(Ecdb_Data_Project *proj) { - if (proj->capacity) evas_object_del(proj->capacity); - if (proj->settings) evas_object_del(proj->settings); - if (proj->filelist_swallow) evas_object_del(proj->filelist_swallow); - if (proj->filelist) ewl_widget_destroy(proj->filelist); FREE(proj->volume_id); FREE(proj->publisher_id); FREE(proj->data_preparer_id); @@ -266,7 +256,6 @@ ecdb_image_project_init(Ecdb_Image_Project *proj) void ecdb_image_project_destroy(Ecdb_Image_Project *proj) { - if (proj->entry) evas_object_del(proj->entry); ecdb_burn_project_destroy(ECDB_BURN(proj)); FREE(proj); } diff --git a/ecdb/trunk/src/ecdb_widgets.c b/ecdb/trunk/src/ecdb_widgets.c index 570526a..f8bfa50 100644 --- a/ecdb/trunk/src/ecdb_widgets.c +++ b/ecdb/trunk/src/ecdb_widgets.c @@ -1011,6 +1011,27 @@ ecdb_combo_data_set(Evas_Object *c, void *data) cd->data = data; } +void * +ecdb_combo_data_get(Evas_Object *c) +{ + Combo_Data *cd; + + if (!c) + { + printf("ecdb_combo_data_get: NULL object!\n"); + return NULL; + } + + cd = evas_object_data_get(c, "cd"); + if (!cd) + { + printf("ecdb_combo_data_set: NULL data!\n"); + return NULL; + } + + return cd->data; +} + void ecdb_combo_clear(Evas_Object *c) { @@ -1097,8 +1118,13 @@ _config_inwin_hide(void *data, Evas *e, Evas_Object *obj, void *event_info) iwd = data; - evas_object_hide(iwd->popup); - evas_object_hide(iwd->back); + if (iwd) + { + if (iwd->popup) + evas_object_hide(iwd->popup); + if (iwd->back) + evas_object_hide(iwd->back); + } } static void @@ -1177,12 +1203,13 @@ ecdb_config_inwin_show(Evas_Object *inwin) evas_object_pass_events_set(iwd->back, 0); evas_object_layer_set(iwd->back, evas_object_layer_get(iwd->parent) + 1); + evas_object_raise(iwd->back); edje_object_signal_emit(iwd->back, "ecdb,config_inwin,back,show", "ecdb"); evas_object_pass_events_set(iwd->popup, 0); evas_object_layer_set(iwd->popup, evas_object_layer_get(iwd->back) + 1); - edje_object_signal_emit(iwd->popup, "ecdb,config_inwin,popup,show", - "ecdb"); + evas_object_raise(iwd->popup); + edje_object_signal_emit(iwd->popup, "ecdb,config_inwin,popup,show", "ecdb"); iwd->visible = 1; } diff --git a/ecdb/trunk/src/ecdb_widgets.h b/ecdb/trunk/src/ecdb_widgets.h index c341dce..948f439 100644 --- a/ecdb/trunk/src/ecdb_widgets.h +++ b/ecdb/trunk/src/ecdb_widgets.h @@ -44,6 +44,7 @@ void ecdb_combo_header_create_set(Evas_Object *c, void int idx)); int ecdb_combo_selected_get(Evas_Object *c); void ecdb_combo_data_set(Evas_Object *c, void *data); +void *ecdb_combo_data_get(Evas_Object *c); void ecdb_combo_clear(Evas_Object *c); Evas_Object *ecdb_label_add(Evas_Object *parent, const char *name);