From c9080663fc481e925ed9d4b683535336942603f0 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Mon, 24 Jul 2006 16:32:34 +0000 Subject: [PATCH] Fix shelf list config dialog to not segfault on delete. Added null checks. Uses sorted e_shelf_list. Disable Delete/Config buttons until a shelf is selected. There are still some issues with the shelf_config dialog itself tho. Seems to sometimes change properties for the wrong shelf. SVN revision: 24157 --- src/bin/e_int_config_shelf.c | 272 ++++++++++++++++++++--------------- 1 file changed, 159 insertions(+), 113 deletions(-) diff --git a/src/bin/e_int_config_shelf.c b/src/bin/e_int_config_shelf.c index a1bd0b460..30e6389df 100644 --- a/src/bin/e_int_config_shelf.c +++ b/src/bin/e_int_config_shelf.c @@ -1,14 +1,22 @@ #include "e.h" -static void *_create_data(E_Config_Dialog *cfd); -static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static void *_create_data(E_Config_Dialog *cfd); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static void _ilist_fill(E_Config_Dialog_Data *cfdata); +static void _ilist_cb_selected(void *data); +static void _cb_add(void *data, void *data2); +static void _cb_delete(void *data, void *data2); +static void _cb_dialog_yes(void *data); +static void _cb_config(void *data, void *data2); struct _E_Config_Dialog_Data { - E_Config_Dialog *cfd; - Evas_Object *ilist; - E_Dialog *confirm_dialog; + Evas_Object *o_list; + Evas_Object *o_delete; + Evas_Object *o_config; + + char *cur_shelf; }; EAPI E_Config_Dialog * @@ -18,13 +26,15 @@ e_int_config_shelf(E_Container *con) E_Config_Dialog_View *v; v = E_NEW(E_Config_Dialog_View, 1); - - v->create_cfdata = _create_data; - v->free_cfdata = _free_data; - v->basic.create_widgets = _basic_create_widgets; - - cfd = e_config_dialog_new(con, _("Shelf Settings"), "enlightenment/shelf", 0, v, NULL); - return cfd; + if (v) + { + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.create_widgets = _basic_create_widgets; + + cfd = e_config_dialog_new(con, _("Shelf Settings"), "enlightenment/shelf", 0, v, NULL); + return cfd; + } } static void * @@ -33,44 +43,81 @@ _create_data(E_Config_Dialog *cfd) E_Config_Dialog_Data *cfdata; cfdata = E_NEW(E_Config_Dialog_Data, 1); - cfdata->cfd = cfd; return cfdata; } static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { - free(cfdata); + E_FREE(cfdata); } -static void -_ilist_fill(E_Config_Dialog_Data *cfdata) +static Evas_Object * +_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { + Evas_Object *o, *of, *ot, *ob; + + o = e_widget_list_add(evas, 0, 1); + + of = e_widget_framelist_add(evas, _("Configured Shelves"), 0); + cfdata->o_list = e_widget_ilist_add(evas, 24, 24, &(cfdata->cur_shelf)); + e_widget_ilist_selector_set(cfdata->o_list, 1); + e_widget_min_size_set(cfdata->o_list, 155, 250); + e_widget_framelist_object_append(of, cfdata->o_list); + e_widget_list_object_append(o, of, 1, 1, 0.5); + + ot = e_widget_table_add(evas, 0); + ob = e_widget_button_add(evas, _("Add"), "widget/add", _cb_add, cfdata, NULL); + e_widget_table_object_append(ot, ob, 0, 0, 1, 1, 1, 1, 1, 0); + cfdata->o_delete = e_widget_button_add(evas, _("Delete"), "widget/del", _cb_delete, cfdata, NULL); + e_widget_table_object_append(ot, cfdata->o_delete, 0, 1, 1, 1, 1, 1, 1, 0); + cfdata->o_config = e_widget_button_add(evas, _("Configure"), "widget/config", _cb_config, cfdata, NULL); + e_widget_table_object_append(ot, cfdata->o_config, 0, 2, 1, 1, 1, 1, 1, 0); + + e_widget_disabled_set(cfdata->o_delete, 1); + e_widget_disabled_set(cfdata->o_config, 1); + + e_widget_list_object_append(o, ot, 1, 1, 0.0); + + _ilist_fill(cfdata); + + return o; +} + +/* private functions */ +static void +_ilist_fill(E_Config_Dialog_Data *cfdata) +{ + Evas *evas; Evas_List *l; - E_Shelf *es; - E_Config_Shelf *escfg; + int n = -1; char buf[256]; - const char *label; - Evas_Object *ob; - int n; - n = e_widget_ilist_selected_get(cfdata->ilist); - e_widget_ilist_clear(cfdata->ilist); - e_widget_ilist_go(cfdata->ilist); + if (!cfdata) return; - for (l = e_shelf_list(); l; l = l->next) + evas = evas_object_evas_get(cfdata->o_list); + + if (e_widget_ilist_count(cfdata->o_list) > 0) + n = e_widget_ilist_selected_get(cfdata->o_list); + + e_widget_ilist_clear(cfdata->o_list); + e_widget_ilist_go(cfdata->o_list); + + for (l = e_shelf_list(); l; l = l->next) { + E_Shelf *es; + Evas_Object *ob; + const char *label; + es = l->data; - escfg = es->cfg; + if (!es) continue; label = es->name; - if (!label) label = ""; + if (!label) label = "shelf"; snprintf(buf, sizeof(buf), "%s #%i", label, es->id); - - /* FIXME: proper icon */ - ob = edje_object_add(evas_object_evas_get(cfdata->ilist)); - switch(escfg->orient) + ob = edje_object_add(evas); + switch(es->cfg->orient) { case E_GADCON_ORIENT_LEFT: e_util_edje_icon_set(ob, "enlightenment/shelf_position_left"); @@ -112,27 +159,54 @@ _ilist_fill(E_Config_Dialog_Data *cfdata) e_util_edje_icon_set(ob, "enlightenment/e"); break; } - - e_widget_ilist_append(cfdata->ilist, ob, buf, NULL, NULL, NULL); + e_widget_ilist_append(cfdata->o_list, ob, buf, _ilist_cb_selected, cfdata, buf); } - e_widget_min_size_set(cfdata->ilist, 155, 250); - e_widget_ilist_go(cfdata->ilist); - e_widget_ilist_selected_set(cfdata->ilist, n); + e_widget_min_size_set(cfdata->o_list, 155, 250); + e_widget_ilist_go(cfdata->o_list); + if (n > -1) + { + e_widget_disabled_set(cfdata->o_delete, 0); + e_widget_disabled_set(cfdata->o_config, 0); + e_widget_ilist_selected_set(cfdata->o_list, n); + } + else + { + e_widget_disabled_set(cfdata->o_delete, 1); + e_widget_disabled_set(cfdata->o_config, 1); + } } -static void -_cb_add(void *data, void *data2) +static void +_ilist_cb_selected(void *data) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = data; + if (!cfdata) return; + + e_widget_disabled_set(cfdata->o_delete, 0); + e_widget_disabled_set(cfdata->o_config, 0); +} + +static void +_cb_add(void *data, void *data2) { E_Config_Dialog_Data *cfdata; E_Config_Shelf *cfg; + E_Container *con; + E_Zone *zone; cfdata = data; - + if (!cfdata) return; + + con = e_container_current_get(e_manager_current_get()); + zone = e_zone_current_get(con); + cfg = E_NEW(E_Config_Shelf, 1); cfg->name = evas_stringshare_add("shelf"); - cfg->container = cfdata->cfd->con->num; - cfg->zone = cfdata->cfd->dia->win->border->zone->num; + cfg->container = con->num; + cfg->zone = zone->num; cfg->popup = 1; cfg->layer = 200; cfg->orient = E_GADCON_ORIENT_CORNER_BR; @@ -146,95 +220,67 @@ _cb_add(void *data, void *data2) e_config_save_queue(); _ilist_fill(cfdata); - e_widget_ilist_selected_set(cfdata->ilist, e_widget_ilist_count(cfdata->ilist) - 1); } -static void -_cb_confirm_dialog_yes(void *data) +static void +_cb_delete(void *data, void *data2) { - E_Shelf *es; - E_Config_Shelf *cfg; E_Config_Dialog_Data *cfdata; - char *dummy; - int i; - - cfdata = data; - sscanf(e_widget_ilist_selected_label_get(cfdata->ilist), "%s #%i", &dummy, &i); - - es = evas_list_nth(e_shelf_list(), i); - if (es) - { - cfg = es->cfg; - e_object_del(E_OBJECT(es)); - - e_config->shelves = evas_list_remove(e_config->shelves, cfg); - if (cfg->name) evas_stringshare_del(cfg->name); - if (cfg->style) evas_stringshare_del(cfg->style); - E_FREE(cfg); - e_config_save_queue(); - - _ilist_fill(cfdata); - } -} -static void -_cb_del(void *data, void *data2) -{ char buf[4096]; - E_Config_Dialog_Data *cfdata; - + cfdata = data; - snprintf(buf, sizeof(buf), _("You requested to delete \"%s\".
" - "
" - "Are you sure you want to delete this shelf?"), - e_widget_ilist_selected_label_get(cfdata->ilist)); - - e_confirm_dialog_show(_("Are you sure you want to delete this shelf?"), "enlightenment/exit", - buf, NULL, NULL, _cb_confirm_dialog_yes, NULL, cfdata, NULL); + if (!cfdata) return; + if (!cfdata->cur_shelf) return; + + snprintf(buf, sizeof(buf), _("You requested to delete \"%s\".

" + "Are you sure you want to delete this shelf?"), + cfdata->cur_shelf); + + e_confirm_dialog_show(_("Are you sure you want to delete this shelf?"), + "enlightenment/exit", buf, NULL, NULL, _cb_dialog_yes, NULL, cfdata, NULL); } -static void -_cb_config(void *data, void *data2) +static void +_cb_dialog_yes(void *data) { E_Config_Dialog_Data *cfdata; E_Shelf *es; char *dummy; + const char *tmp; int i; cfdata = data; - sscanf(e_widget_ilist_selected_label_get(cfdata->ilist), "%s #%i", &dummy, &i); + if (!cfdata) return; + if (!cfdata->cur_shelf) return; + tmp = strdup(cfdata->cur_shelf); + sscanf(tmp, "%s #%i", dummy, &i); + es = evas_list_nth(e_shelf_list(), i); + if (!es) return; + + e_shelf_unsave(es); + e_object_del(E_OBJECT(es)); + e_config_save_queue(); + + _ilist_fill(cfdata); +} + +static void +_cb_config(void *data, void *data2) +{ + E_Config_Dialog_Data *cfdata; + E_Shelf *es; + char *dummy; + const char *tmp; + int i; + + cfdata = data; + if (!cfdata) return; + if (!cfdata->cur_shelf) return; + + tmp = strdup(cfdata->cur_shelf); + sscanf(tmp, "%s #%i", dummy, &i); es = evas_list_nth(e_shelf_list(), i); if (!es) return; if (!es->config_dialog) e_int_shelf_config(es); } - -static Evas_Object * -_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) -{ - Evas_Object *o, *of, *oi, *ob, *ol; - - o = e_widget_list_add(evas, 0, 1); - - of = e_widget_framelist_add(evas, _("Configured Shelves"), 0); - oi = e_widget_ilist_add(evas, 24, 24, NULL); - e_widget_ilist_selector_set(oi, 1); - cfdata->ilist = oi; - - _ilist_fill(cfdata); - e_widget_min_size_set(oi, 155, 250); - e_widget_framelist_object_append(of, oi); - e_widget_list_object_append(o, of, 1, 1, 0.5); - - ol = e_widget_table_add(evas, 0); - - ob = e_widget_button_add(evas, _("Add"), "widget/add", _cb_add, cfdata, NULL); - e_widget_table_object_append(ol, ob, 0, 0, 1, 1, 1, 1, 1, 0); - ob = e_widget_button_add(evas, _("Delete"), "widget/del", _cb_del, cfdata, NULL); - e_widget_table_object_append(ol, ob, 0, 1, 1, 1, 1, 1, 1, 0); - ob = e_widget_button_add(evas, _("Configure..."), "widget/config", _cb_config, cfdata, NULL); - e_widget_table_object_append(ol, ob, 0, 2, 1, 1, 1, 1, 1, 0); - - e_widget_list_object_append(o, ol, 1, 1, 0.0); - - return o; -}