Enlightenment CVS committal Author : devilhorns Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_int_config_shelf.c Log Message: 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. =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_int_config_shelf.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- e_int_config_shelf.c 23 Jul 2006 13:45:43 -0000 1.16 +++ e_int_config_shelf.c 24 Jul 2006 16:32:34 -0000 1.17 @@ -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_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 @@ 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); - for (l = e_shelf_list(); l; l = l->next) + if (!cfdata) return; + + 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 @@ 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->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 +_ilist_cb_selected(void *data) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = data; + if (!cfdata) return; - 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_disabled_set(cfdata->o_delete, 0); + e_widget_disabled_set(cfdata->o_config, 0); } -static void -_cb_add(void *data, void *data2) +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 @@ 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_Config_Dialog_Data *cfdata; + char buf[4096]; + + cfdata = data; + if (!cfdata) return; + if (!cfdata->cur_shelf) return; + + snprintf(buf, sizeof(buf), _("You requested to delete \"%s\".<br><br>" + "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_dialog_yes(void *data) { - E_Shelf *es; - E_Config_Shelf *cfg; 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) - { - 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; + if (!es) return; - cfdata = data; - snprintf(buf, sizeof(buf), _("You requested to delete \"%s\".<br>" - "<br>" - "Are you sure you want to delete this shelf?"), - e_widget_ilist_selected_label_get(cfdata->ilist)); + e_shelf_unsave(es); + e_object_del(E_OBJECT(es)); + e_config_save_queue(); - 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); + _ilist_fill(cfdata); } -static void -_cb_config(void *data, void *data2) +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; - 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; 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; } ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs