From 293bae0b7e16551465ed0faae441918fb436523b Mon Sep 17 00:00:00 2001 From: kiwi Date: Mon, 21 May 2007 12:30:41 +0000 Subject: [PATCH] * [parse] better handle for html chars (not finished) * [parse] speed optimisations * [dialog] feeds/feed: better ui * [dialog] feeds: fix moving feeds up and down * [dialog] item: fix po problem * [dialog/viewer] fix reselect item on ilist refresh SVN revision: 30050 --- TODO | 20 ++- src/module/news_config_dialog.c | 2 +- src/module/news_config_dialog_feed.c | 93 +++++------- src/module/news_config_dialog_feeds.c | 94 ++++++------ src/module/news_config_dialog_item.c | 2 +- src/module/news_config_dialog_item_content.c | 4 +- src/module/news_config_dialog_langs.c | 2 +- src/module/news_feed.h | 16 +-- src/module/news_parse.c | 2 +- src/module/news_parse_private.h | 4 +- src/module/news_parse_rss.c | 143 ++++++++++++------- src/module/news_viewer.c | 5 +- 12 files changed, 216 insertions(+), 171 deletions(-) diff --git a/TODO b/TODO index 5b9080c..a9fe7cb 100644 --- a/TODO +++ b/TODO @@ -4,13 +4,31 @@ make install CFLAGS="-g -Wall -Werror -DDEBUG -DDEBUG_MAIN -DDEBUG_CONFIG -DDEBU BUGS ---------------------------------------------------- + - X - ? rarely, on viewer open, it crashes in news_viewer_refresh, on e_icon_file_set (in evas engine loader func) +the evas object seems ok, the string passed to the loader too ... + +---------------------------------------------------- +FEEDS TO ADD +---------------------------------------------------- + + sinon pur les feeds humour : http://www.lelombrik.net/ http://www.bashfr.org/ + pour les feeds info tech: clubic pcimpact + +mails juan +mails ludger + ---------------------------------------------------- NEEDED (to do more or less in this order) ---------------------------------------------------- - - parse html chars (in _item_clean ?) + - debug html chars parse with test.rss + -> add support for & alone in evas_textblock + + - ? merge news_parse_rss.c/h to news_parse.c/h ? - atom feeds + - viewer: a way to set vcontent bg color ? + - feed icons (new file ?) Evas_Object *news_feed_icon_add(News_Feed *feed) void news_feed_icon_del(Evas_Object *obj) diff --git a/src/module/news_config_dialog.c b/src/module/news_config_dialog.c index fb7300b..b7fefb3 100644 --- a/src/module/news_config_dialog.c +++ b/src/module/news_config_dialog.c @@ -203,7 +203,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf of = e_widget_frametable_add(evas, _("Feeds"), 0); - ob = e_widget_check_add(evas, _("Sort lists by name"), &(cfdata->feed.sort_name)); + ob = e_widget_check_add(evas, _("Sort lists by name (disable Move action)"), &(cfdata->feed.sort_name)); e_widget_frametable_object_append(of, ob, 0, 1, 2, 1, 1, 1, 1, 0); e_widget_list_object_append(o, of, 1, 1, 0.5); diff --git a/src/module/news_config_dialog_feed.c b/src/module/news_config_dialog_feed.c index 3cceb49..a7105a6 100644 --- a/src/module/news_config_dialog_feed.c +++ b/src/module/news_config_dialog_feed.c @@ -11,8 +11,6 @@ struct _E_Config_Dialog_Data Evas_Object *icon_sel; E_Dialog *icon_sel_dia; - - int in_advanced; } gui; char *name; @@ -26,7 +24,7 @@ struct _E_Config_Dialog_Data char *url_feed; char *icon; int icon_ovrw; - int urgent; + int urgent; News_Feed_Category *category; News_Feed *feed; @@ -111,7 +109,6 @@ news_config_dialog_feed_refresh_categories(News_Feed *feed) if (!news->config_dialog_feed_new) return; cfdata = news->config_dialog_feed_new->cfdata; } - if (cfdata->gui.in_advanced) return; ilist = cfdata->gui.ilist_categories; e_widget_ilist_freeze(ilist); @@ -144,6 +141,7 @@ news_config_dialog_feed_refresh_categories(News_Feed *feed) pos++; } e_widget_ilist_go(ilist); + e_widget_ilist_thaw(ilist); if (pos_to_select != -1) { @@ -153,8 +151,6 @@ news_config_dialog_feed_refresh_categories(News_Feed *feed) e_widget_min_size_get(ilist, &w, NULL); e_widget_min_size_set(ilist, w, 110); - - e_widget_ilist_thaw(ilist); } void @@ -177,7 +173,6 @@ news_config_dialog_feed_refresh_langs(News_Feed *feed) if (!news->config_dialog_feed_new) return; cfdata = news->config_dialog_feed_new->cfdata; } - if (cfdata->gui.in_advanced) return; ilist = cfdata->gui.ilist_langs; e_widget_ilist_freeze(ilist); @@ -199,6 +194,7 @@ news_config_dialog_feed_refresh_langs(News_Feed *feed) pos++; } e_widget_ilist_go(ilist); + e_widget_ilist_thaw(ilist); if (pos_to_select != -1) e_widget_ilist_selected_set(ilist, pos_to_select); @@ -209,8 +205,6 @@ news_config_dialog_feed_refresh_langs(News_Feed *feed) e_widget_min_size_get(ilist, &w, NULL); e_widget_min_size_set(ilist, w, 110); - - e_widget_ilist_thaw(ilist); } /* @@ -311,35 +305,11 @@ static Evas_Object * _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { Evas_Object *o; - Evas_Object *of, *ob; - cfdata->gui.in_advanced = 0; - o = e_widget_table_add(evas, 0); _common_create_widgets(cfd, evas, cfdata, o); - of = e_widget_framelist_add(evas, _("Category"), 0); - - ob = e_widget_ilist_add(evas, 16, 16, NULL); - e_widget_ilist_selector_set(ob, 1); - cfdata->gui.ilist_categories = ob; - news_config_dialog_feed_refresh_categories(cfdata->feed); - e_widget_framelist_object_append(of, ob); - - e_widget_table_object_append(o, of, 0, 1, 1, 1, 1, 1, 1, 1); - - of = e_widget_framelist_add(evas, _("Language"), 0); - - ob = e_widget_ilist_add(evas, 16, 16, NULL); - e_widget_ilist_selector_set(ob, 1); - e_widget_on_change_hook_set(ob, _cb_lang_change, cfdata); - cfdata->gui.ilist_langs = ob; - news_config_dialog_feed_refresh_langs(cfdata->feed); - e_widget_framelist_object_append(of, ob); - - e_widget_table_object_append(o, of, 1, 1, 1, 1, 1, 1, 1, 1); - e_dialog_resizable_set(cfd->dia, 1); return o; @@ -350,7 +320,7 @@ _common_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *c { Evas_Object *of, *ob; - of = e_widget_frametable_add(evas, _("Icon"), 0); + of = e_widget_frametable_add(evas, _("Basic informations"), 0); ob = e_widget_button_add(evas, "", NULL, _icon_select, cfdata, NULL); @@ -358,34 +328,49 @@ _common_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *c if (cfdata->icon) _icon_select_changed(cfdata); e_widget_min_size_set(ob, 48, 48); - e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0); + e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 0, 0, 0, 0); - ob = e_widget_check_add(evas, _("Get from the server"), &(cfdata->icon_ovrw)); + //ob = e_widget_check_add(evas, _("Get from the server"), &(cfdata->icon_ovrw)); //TODO: NOT IMPLEMENTED YET - e_widget_check_checked_set(ob, 0); - e_widget_disabled_set(ob, 1); - e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1); - - e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 0); - - - of = e_widget_framelist_add(evas, _("Basic informations"), 0); + //e_widget_check_checked_set(ob, 0); + //e_widget_disabled_set(ob, 1); + // e_widget_list_object_append(o2, of, 1, 1, 0.5); ob = e_widget_label_add(evas, _("Name :")); - e_widget_framelist_object_append(of, ob); + e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 0, 1, 0); ob = e_widget_entry_add(evas, &(cfdata->name)); - e_widget_framelist_object_append(of, ob); + e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 0, 1, 0); ob = e_widget_label_add(evas, _("Feed url :")); - e_widget_framelist_object_append(of, ob); + e_widget_frametable_object_append(of, ob, 0, 3, 1, 1, 1, 0, 1, 0); ob = e_widget_entry_add(evas, &(cfdata->url_feed)); - e_widget_framelist_object_append(of, ob); - + e_widget_frametable_object_append(of, ob, 0, 4, 1, 1, 1, 0, 1, 0); ob = e_widget_check_add(evas, _("Mark as important feed"), &(cfdata->urgent)); //TODO: NOT IMPLEMENTED YET e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append(of, ob, 0, 5, 1, 1, 1, 0, 1, 0); + + e_widget_table_object_append(o, of, 0, 0, 2, 1, 1, 1, 1, 1); + + of = e_widget_framelist_add(evas, _("Category"), 0); + + ob = e_widget_ilist_add(evas, 16, 16, NULL); + e_widget_ilist_selector_set(ob, 1); + cfdata->gui.ilist_categories = ob; + news_config_dialog_feed_refresh_categories(cfdata->feed); e_widget_framelist_object_append(of, ob); - e_widget_table_object_append(o, of, 1, 0, 1, 1, 1, 1, 1, 0); + e_widget_table_object_append(o, of, 2, 0, 2, 1, 1, 1, 1, 1); + + of = e_widget_framelist_add(evas, _("Language"), 0); + + ob = e_widget_ilist_add(evas, 16, 16, NULL); + e_widget_ilist_selector_set(ob, 1); + e_widget_on_change_hook_set(ob, _cb_lang_change, cfdata); + cfdata->gui.ilist_langs = ob; + news_config_dialog_feed_refresh_langs(cfdata->feed); + e_widget_framelist_object_append(of, ob); + + e_widget_table_object_append(o, of, 4, 0, 2, 1, 1, 1, 1, 1); } static Evas_Object * @@ -394,8 +379,6 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data Evas_Object *o; Evas_Object *of, *ob; - cfdata->gui.in_advanced = 1; - o = e_widget_table_add(evas, 0); _common_create_widgets(cfd, evas, cfdata, o); @@ -412,7 +395,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data ob = e_widget_entry_add(evas, &(cfdata->url_home)); e_widget_framelist_object_append(of, ob); - e_widget_table_object_append(o, of, 0, 2, 2, 1, 1, 1, 1, 1); + e_widget_table_object_append(o, of, 0, 1, 3, 1, 1, 0, 1, 0); of = e_widget_framelist_add(evas, _("Server informations"), 0); @@ -429,7 +412,9 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data ob = e_widget_check_add(evas, _("Home url"), &(cfdata->url_home_ovrw)); e_widget_framelist_object_append(of, ob); - e_widget_table_object_append(o, of, 0, 4, 2, 1, 1, 1, 1, 1); + e_widget_table_object_append(o, of, 3, 1, 3, 1, 1, 0, 1, 0); + + e_dialog_resizable_set(cfd->dia, 1); return o; } diff --git a/src/module/news_config_dialog_feeds.c b/src/module/news_config_dialog_feeds.c index 592aeb2..36707f1 100644 --- a/src/module/news_config_dialog_feeds.c +++ b/src/module/news_config_dialog_feeds.c @@ -159,6 +159,7 @@ news_config_dialog_feeds_refresh_feeds(void) } } e_widget_ilist_go(ilist); + e_widget_ilist_thaw(ilist); /* select a feed */ if (pos_to_select != -1) @@ -176,8 +177,6 @@ news_config_dialog_feeds_refresh_feeds(void) e_widget_min_size_get(ilist, &wmw, &wmh); e_widget_min_size_set(ilist, wmw, 180); } - - e_widget_ilist_thaw(ilist); } void @@ -225,11 +224,13 @@ news_config_dialog_feeds_refresh_categories(void) if (cfdata->selected_category == fc) pos_to_select = pos; } + e_widget_ilist_go(ilist); + e_widget_ilist_thaw(ilist); if (pos_to_select != -1) { e_widget_ilist_selected_set(ilist, pos_to_select); - _cb_category_list(cfdata->selected_category); + //_cb_category_list(cfdata->selected_category); } if (pos == -1) @@ -240,9 +241,6 @@ news_config_dialog_feeds_refresh_categories(void) e_widget_min_size_get(ilist, &wmw, &wmh); e_widget_min_size_set(ilist, wmw, 120); } - - e_widget_ilist_go(ilist); - e_widget_ilist_thaw(ilist); } /* @@ -300,29 +298,32 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf e_widget_ilist_selector_set(ob, 1); cfdata->ilist_categories = ob; news_config_dialog_feeds_refresh_categories(); - e_widget_frametable_object_append(of, ob, 1, 0, 3, 4, 1, 1, 1, 1); + e_widget_frametable_object_append(of, ob, 0, 0, 6, 1, 1, 1, 1, 1); if (!news->config->feed.sort_name) { - ob = e_widget_button_add(evas, "", "widget/up_arrow", _cb_category_up, cfdata, NULL); - e_widget_frametable_object_append(of, ob, 4, 1, 1, 1, 0, 0, 0, 0); - ob = e_widget_button_add(evas, "", "widget/down_arrow", _cb_category_down, cfdata, NULL); - e_widget_frametable_object_append(of, ob, 4, 2, 1, 1, 0, 0, 0, 0); + ob = e_widget_button_add(evas, "Move", "widget/up_arrow", _cb_category_up, cfdata, NULL); + e_widget_frametable_object_append(of, ob, 0, 1, 3, 1, 1, 0, 1, 0); + ob = e_widget_button_add(evas, "Move", "widget/down_arrow", _cb_category_down, cfdata, NULL); + e_widget_frametable_object_append(of, ob, 3, 1, 3, 1, 1, 0, 1, 0); } ob = e_widget_button_add(evas, _("Add"), NULL, _cb_category_add, cfdata, NULL); - e_widget_frametable_object_append(of, ob, 1, 4, 1, 1, 1, 0, 1, 0); + e_widget_frametable_object_append(of, ob, 0, 2, 2, 1, 1, 0, 1, 0); ob = e_widget_button_add(evas, _("Delete"), NULL, _cb_category_del, cfdata, NULL); e_widget_disabled_set(ob, 1); cfdata->button_cat_del = ob; - e_widget_frametable_object_append(of, ob, 2, 4, 1, 1, 1, 0, 1, 0); + e_widget_frametable_object_append(of, ob, 2, 2, 2, 1, 1, 0, 1, 0); ob = e_widget_button_add(evas, _("Configure"), NULL, _cb_category_config, cfdata, NULL); e_widget_disabled_set(ob, 1); cfdata->button_cat_conf = ob; - e_widget_frametable_object_append(of, ob, 3, 4, 1, 1, 1, 0, 1, 0); + e_widget_frametable_object_append(of, ob, 4, 2, 2, 1, 1, 0, 1, 0); e_widget_list_object_append(o2, of, 1, 1, 0.5); + ob = e_widget_label_add(evas, ""); + e_widget_list_object_append(o2, ob, 0, 0, 0.5); + o3 = e_widget_list_add(evas, 0, 1); of = e_widget_framelist_add(evas, _("Languages"), 1); @@ -358,34 +359,34 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf cfdata->textblock_feed_infos = ob; e_widget_min_size_get(ob, &wmw, &wmh); e_widget_min_size_set(ob, wmw, 40); - e_widget_frametable_object_append(of, ob, 0, 0, 4, 1, 1, 1, 0, 0); + e_widget_frametable_object_append(of, ob, 0, 0, 6, 1, 1, 1, 0, 0); cfdata->selected_feed = NULL; ob = e_widget_ilist_add(evas, 16, 16, NULL); e_widget_ilist_selector_set(ob, 1); cfdata->ilist_feeds = ob; news_config_dialog_feeds_refresh_feeds(); - e_widget_frametable_object_append(of, ob, 0, 1, 3, 4, 1, 1, 1, 1); - - ob = e_widget_button_add(evas, _("Add"), NULL, _cb_feed_add, cfdata, NULL); - e_widget_frametable_object_append(of, ob, 0, 5, 1, 1, 1, 0, 1, 0); - ob = e_widget_button_add(evas, _("Delete"), NULL, _cb_feed_del, cfdata, NULL); - e_widget_disabled_set(ob, 1); - cfdata->button_feed_del = ob; - e_widget_frametable_object_append(of, ob, 1, 5, 1, 1, 1, 0, 1, 0); - ob = e_widget_button_add(evas, _("Configure"), NULL, _cb_feed_config, cfdata, NULL); - e_widget_disabled_set(ob, 1); - cfdata->button_feed_conf = ob; - e_widget_frametable_object_append(of, ob, 2, 5, 1, 1, 1, 0, 1, 0); + e_widget_frametable_object_append(of, ob, 0, 1, 6, 1, 1, 1, 1, 1); if (!news->config->feed.sort_name) { - ob = e_widget_button_add(evas, "", "widget/up_arrow", _cb_feed_up, cfdata, NULL); - e_widget_frametable_object_append(of, ob, 3, 2, 1, 1, 0, 0, 0, 0); - ob = e_widget_button_add(evas, "", "widget/down_arrow", _cb_feed_down, cfdata, NULL); - e_widget_frametable_object_append(of, ob, 3, 3, 1, 1, 0, 0, 0, 0); + ob = e_widget_button_add(evas, "Move", "widget/up_arrow", _cb_feed_up, cfdata, NULL); + e_widget_frametable_object_append(of, ob, 0, 2, 3, 1, 1, 0, 1, 0); + ob = e_widget_button_add(evas, "Move", "widget/down_arrow", _cb_feed_down, cfdata, NULL); + e_widget_frametable_object_append(of, ob, 3, 2, 3, 1, 1, 0, 1, 0); } + ob = e_widget_button_add(evas, _("Add"), NULL, _cb_feed_add, cfdata, NULL); + e_widget_frametable_object_append(of, ob, 0, 3, 2, 1, 1, 0, 1, 0); + ob = e_widget_button_add(evas, _("Delete"), NULL, _cb_feed_del, cfdata, NULL); + e_widget_disabled_set(ob, 1); + cfdata->button_feed_del = ob; + e_widget_frametable_object_append(of, ob, 2, 3, 2, 1, 1, 0, 1, 0); + ob = e_widget_button_add(evas, _("Configure"), NULL, _cb_feed_config, cfdata, NULL); + e_widget_disabled_set(ob, 1); + cfdata->button_feed_conf = ob; + e_widget_frametable_object_append(of, ob, 4, 3, 2, 1, 1, 0, 1, 0); + e_widget_list_object_append(o, of, 1, 1, 0.5); e_dialog_resizable_set(cfd->dia, 1); @@ -595,26 +596,29 @@ _cb_category_list(void *data) if (cfdata->button_cat_conf) e_widget_disabled_set(cfdata->button_cat_conf, 0); - cfdata->selected_category = c; - - /* select the first feed in this category */ - if (c->feeds_visible) + if (cfdata->selected_category != c) { - pos = 0; - while ((label = e_widget_ilist_nth_label_get(cfdata->ilist_feeds, pos))) + cfdata->selected_category = c; + + /* select the first feed in this category */ + if (c->feeds_visible) { - if (e_widget_ilist_nth_is_header(cfdata->ilist_feeds, pos)) + pos = 0; + while ((label = e_widget_ilist_nth_label_get(cfdata->ilist_feeds, pos))) { - if (!strcmp(label, c->name)) + if (e_widget_ilist_nth_is_header(cfdata->ilist_feeds, pos)) { - /* trick to call the callback in selected_set */ - e_widget_ilist_selector_set(cfdata->ilist_feeds, 0); - e_widget_ilist_selected_set(cfdata->ilist_feeds, pos+1); - e_widget_ilist_selector_set(cfdata->ilist_feeds, 1); - break; + if (!strcmp(label, c->name)) + { + /* trick to call the callback in selected_set */ + e_widget_ilist_selector_set(cfdata->ilist_feeds, 0); + e_widget_ilist_selected_set(cfdata->ilist_feeds, pos+1); + e_widget_ilist_selector_set(cfdata->ilist_feeds, 1); + break; + } } + pos++; } - pos++; } } } diff --git a/src/module/news_config_dialog_item.c b/src/module/news_config_dialog_item.c index 0f3efc8..1dcd9db 100644 --- a/src/module/news_config_dialog_item.c +++ b/src/module/news_config_dialog_item.c @@ -127,7 +127,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf e_widget_list_object_append(o, of, 1, 1, 0.0); - ob = e_widget_label_add(evas, _("")); + ob = e_widget_label_add(evas, ""); e_widget_list_object_append(o, ob, 1, 1, 0.0); ob = e_widget_check_add(evas, _("Apply this to all News gadgets"), &(cfdata->apply_to_all)); e_widget_list_object_append(o, ob, 1, 1, 0.0); diff --git a/src/module/news_config_dialog_item_content.c b/src/module/news_config_dialog_item_content.c index f3615b3..7b5229a 100644 --- a/src/module/news_config_dialog_item_content.c +++ b/src/module/news_config_dialog_item_content.c @@ -134,6 +134,7 @@ news_config_dialog_item_content_refresh_feeds(News_Item *ni) e_widget_ilist_multi_select(ilist, pos); } } + e_widget_ilist_thaw(ilist); e_widget_min_size_get(ilist, &iw, &ih); if (iw < 200) iw = 200; @@ -141,7 +142,6 @@ news_config_dialog_item_content_refresh_feeds(News_Item *ni) e_widget_ilist_go(ilist); _cb_feed_change(cfdata, NULL); - e_widget_ilist_thaw(ilist); /* restore the callback */ e_widget_on_change_hook_set(ilist, _cb_feed_change, cfdata); } @@ -195,8 +195,8 @@ news_config_dialog_item_content_refresh_selected_feeds(News_Item *ni) e_widget_min_size_set(ilist, iw, 250); e_widget_ilist_go(ilist); - _cb_selected_feed_change(cfdata, NULL); e_widget_ilist_thaw(ilist); + _cb_selected_feed_change(cfdata, NULL); /* restore the callback */ e_widget_on_change_hook_set(ilist, _cb_selected_feed_change, cfdata); } diff --git a/src/module/news_config_dialog_langs.c b/src/module/news_config_dialog_langs.c index 204703e..5c0bcc3 100644 --- a/src/module/news_config_dialog_langs.c +++ b/src/module/news_config_dialog_langs.c @@ -124,7 +124,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf e_widget_list_object_append(o, ob, 1, 1, 0.5); ob = e_widget_label_add(evas, _("Please select the languages that you are able to read")); e_widget_list_object_append(o, ob, 1, 1, 0.0); - ob = e_widget_label_add(evas, _("")); + ob = e_widget_label_add(evas, ""); e_widget_list_object_append(o, ob, 1, 1, 0.0); } diff --git a/src/module/news_feed.h b/src/module/news_feed.h index bda40a2..04f8824 100644 --- a/src/module/news_feed.h +++ b/src/module/news_feed.h @@ -255,7 +255,7 @@ struct _News_Feed_Document News_Popup_Warn *popw; Evas_List *articles; int unread_count; - int ui_needrefresh : 1; + unsigned char ui_needrefresh : 1; struct { @@ -264,10 +264,10 @@ struct _News_Feed_Document Ecore_Event_Handler *handler_del; Ecore_Event_Handler *handler_data; - int waiting_reply : 1; - int nb_tries; - char *buffer; - int buffer_size; + unsigned char waiting_reply : 1; + int nb_tries; + char *buffer; + int buffer_size; } server; struct @@ -280,7 +280,7 @@ struct _News_Feed_Document const char *charset; News_Parse *parser; - int got_infos : 1; + unsigned char got_infos : 1; time_t last_time; News_Parse_Error error; } parse; @@ -290,8 +290,8 @@ struct _News_Feed_Article { News_Feed_Document *doc; - int unread : 1; - int reused : 1; + unsigned char unread : 1; + unsigned char reused : 1; char *title; char *url; diff --git a/src/module/news_parse.c b/src/module/news_parse.c index 61fa2db..57c457c 100644 --- a/src/module/news_parse.c +++ b/src/module/news_parse.c @@ -261,7 +261,7 @@ _parse_type(News_Feed_Document *doc) buf = doc->server.buffer; - p = strstr(buf, "error = err; parser->oc.action = NEWS_PARSE_OC_END; @@ -246,7 +246,7 @@ _parse_article_init(News_Parse *parser) return NEWS_PARSE_ERROR_NO; } - p1 = strstr(pos, parser->doc->parse.meta_article); // FIXME: valgrind says "Invalid read of size 1" ... ??? maybe valgrind is lost + p1 = strstr(pos, parser->doc->parse.meta_article); if (!p1) { if (evas_list_count(parser->articles)) @@ -506,11 +506,11 @@ _parse_item_clean(News_Parse *parser) size = strlen(buf) + 1; new_size = size; + //FIXME use macros for nicer code while (*p) { //DPARSE(("%d %d ------\n%30.30s", size, new_size, p)); - /* skip metas inside text */ - if (*p == '<') + if (*p == '<') /* meta open, we are going to skip metas inside text */ { char *p2; @@ -519,11 +519,11 @@ _parse_item_clean(News_Parse *parser) { if (!strncmp(p, "')); if (*p2) { - memmove(p, p2 + 1, strlen(p2 + 1) + 1); + memmove(p, p2 + 1, (buf + new_size) - (p2 + 1)); new_size -= ((p2 + 1) - p); } else @@ -555,21 +555,22 @@ _parse_item_clean(News_Parse *parser) } } } - else if (*p == ']') /* skip end cfdata */ + else if (*p == ']') /* skip end cfdata */ { if (!strncmp(p + 1, "]>", 2)) { - memmove(p, p + 3, strlen(p + 3) + 1); + memmove(p, p + 3, (buf + new_size) - (p + 3)); new_size -= 3; } else p++; /* next char */ } - else if (*p == 0xa) /* \n */ + else if (*p == 0xa) /* \n */ { - if (parser->oc.action == NEWS_PARSE_OC_ITEM_TITLE) + if (parser->oc.action == NEWS_PARSE_OC_ITEM_TITLE_CLEAN) { - memmove(p, p + 1, strlen(p + 1) + 1); + /* remove \n when in title */ + memmove(p, p + 1, (buf + new_size) - (p + 1)); new_size -= 1; } else @@ -584,8 +585,8 @@ _parse_item_clean(News_Parse *parser) buf = realloc(buf, size); p = buf + diff; } - DPARSE(("buf %p p %p new_size %d strlen(buf) %d strlen(p) %d\np :\n%30.30s\n", buf, p, new_size, (int)strlen(buf), (int)strlen(p), p )); - memmove(p + 3, p, strlen(p) + 1); + DPARSE(("buf %p p %p new_size %d strlen(buf) %d strlen(p) %d\np :\n%30.30s\n", buf, p, new_size, (int)strlen(buf), (int)strlen(p), p)); + memmove(p + 3, p, (buf + (new_size - 3)) - (p)); *p = '<'; *(p + 1) = 'b'; *(p + 2) = 'r'; @@ -593,11 +594,12 @@ _parse_item_clean(News_Parse *parser) p = p + 4; } } - else if (*p == 0x9) /* \t */ + else if (*p == 0x9) /* \t */ { - if (parser->oc.action == NEWS_PARSE_OC_ITEM_TITLE) + if (parser->oc.action == NEWS_PARSE_OC_ITEM_TITLE_CLEAN) { - memmove(p, p + 1, strlen(p + 1) + 1); //FIXME : strlen(p) ? EVERYWHERE ? + /* remove \t when in title */ + memmove(p, p + 1, (buf + new_size) - (p + 1)); new_size -= 1; } else @@ -612,7 +614,7 @@ _parse_item_clean(News_Parse *parser) buf = realloc(buf, size); p = buf + diff; } - memmove(p + 4, p, strlen(p) + 1); + memmove(p + 4, p, (buf + (new_size - 4)) - (p)); *p = '<'; *(p + 1) = 't'; *(p + 2) = 'a'; @@ -621,58 +623,95 @@ _parse_item_clean(News_Parse *parser) p = p + 5; } } - else if (*p == 0xd) /* \??? (newline) to nothing */ + else if (*p == 0xd) /* \ (newline) to nothing */ { - memmove(p, p + 1, strlen(p + 1) + 1); + memmove(p, p + 1, (buf + new_size) - (p + 1)); new_size -= 1; } - else if (*p == '&') /* html codes */ + else if (*p == '&') /* html codes */ { - /* < convertion to < - * > is checked when skipping meta */ - if (!strncmp(p + 1, "lt;", 3)) - { - memmove(p + 1, p + 4, strlen(p + 4) + 1); - new_size -= 3; - *p = '<'; - } - else if (0) /* TODO: add html chars convertion */ - { - - } - else if (*(p + 1) == '#') /* ascii hexadecimal char */ + char *p_inc; + + p_inc = p + 1; + if (*p_inc == '#') /* html numbers = ascii hexadecimal char */ { char b[4]; unsigned int i; int len; char *p2 = p + 2; - /* dec->hex */ - //TODO: FIX ! - while (*p2 != ';') + while (*p2 && (*p2 != ';')) p2++; p2++; - if (((p2 - p) == 3) || (p2 - p) > 6) - p = p2; /* next char */ - else //TODO: STOPPED HERE + len = p2 - p; + if ((len <= 3) || (len > 7) || !sscanf(p + 2, "%d", &i)) + p = p_inc; /* next char (invalid html char number) */ + else if ((i == 8216) || (i == 8217)) /* html num ' */ { - if (!sscanf(p + 2, "%d", &i)) - p = p2 + 1; /* next char */ - else - { - snprintf(b, sizeof(b), "%c", i); - len = strlen(b); - memmove(p + 1, p2, strlen(p2) + 1); - new_size -= (p2 - p - 1); - memcpy(p, b, len); - } + memmove(p_inc, p + 7, (buf + new_size) - (p + 7)); + new_size -= 6; + *p = '\''; + p = p_inc; /* next char */ + } + else if ((i == 171) || (i == 187)) /* html num " */ + { + memmove(p_inc, p + 6, (buf + new_size) - (p + 6)); + new_size -= 5; + *p = '"'; + p = p_inc; /* next char */ + } + else /* html code convertion dec->hex */ + { + snprintf(b, sizeof(b), "%c", i); + memmove(p_inc, p2, (buf + new_size) - (p2)); + new_size -= (p2 - p - 1); + *p = b[0]; + /* stay on the same char, could be the start of meta/html char */ } } + else if (!strncmp(p_inc, "lt;", 3)) /* html < */ + { + memmove(p_inc, p + 4, (buf + new_size) - (p + 4)); + new_size -= 3; + *p = '<'; + /* stay on the same char, could be start of a meta */ + } /* > is checked when skipping meta */ + else if ( !strncmp(p_inc, "amp;", 4) && /* html & */ + ( (parser->oc.action != NEWS_PARSE_OC_ITEM_DESCRIPTION_CLEAN) || + (*(p_inc+4) == '#') ) ) /* but if we are going to write on a tb, we must not convert, except if the next char is an html num char (cause we need to parse it next) */ + //FIXME thats a quick fix, must fix evas_object_textblock so it supports & alone + { + memmove(p_inc, p + 5, (buf + new_size) - (p + 5)); + new_size -= 4; + *p = '&'; + /* stay on the same char, could be start of an html char */ + } + else if (!strncmp(p_inc, "quot;", 5)) /* html " */ + { + memmove(p_inc, p + 6, (buf + new_size) - (p + 6)); + new_size -= 5; + *p = '"'; + p = p_inc; /* next char */ + } + else if (!strncmp(p_inc, "apos;", 5)) /* html ' */ + { + memmove(p_inc, p + 6, (buf + new_size) - (p + 6)); + new_size -= 5; + *p = '\''; + p = p_inc; /* next char */ + } + else if (!strncmp(p_inc, "nbsp;", 5)) /* html space */ + { + memmove(p_inc, p + 6, (buf + new_size) - (p + 6)); + new_size -= 5; + *p = ' '; + p = p_inc; /* next char */ + } else - p++; /* next char */ + p = p_inc; /* next char */ } else - p++; /* nothing interesting :) next char */ + p++; /* nothing interesting :) next char */ } diff --git a/src/module/news_viewer.c b/src/module/news_viewer.c index 7c66a49..e78ba3e 100644 --- a/src/module/news_viewer.c +++ b/src/module/news_viewer.c @@ -198,6 +198,7 @@ news_viewer_refresh(News_Viewer *nv) } NEWS_ITEM_FEEDS_FOREACH_END(); e_widget_ilist_go(ilist); + e_widget_ilist_thaw(ilist); /* select a feed */ if (toselect_pos != -1) @@ -230,8 +231,6 @@ news_viewer_refresh(News_Viewer *nv) nv->vfeeds.list_own = feed_refs_own; _vfeeds_buttons_state_refresh(nv); - - e_widget_ilist_thaw(ilist); } int @@ -767,6 +766,7 @@ _varticles_refresh(News_Viewer *nv) } } e_widget_ilist_go(ilist); + e_widget_ilist_thaw(ilist); /* select a feed, of if no articles are selected @@ -788,7 +788,6 @@ _varticles_refresh(News_Viewer *nv) nv->varticles.list = articles; nv->varticles.list_own = articles_own; - e_widget_ilist_thaw(ilist); feed->doc->ui_needrefresh = 0; }