[evolution-rss] correctly parse atom description construct (deb bug #528827)



commit 51b138995bca0756435345bce1d3b69e36297ff9
Author: Lucian Langa <lucilanga gnome org>
Date:   Tue May 26 17:33:06 2009 +0300

    correctly parse atom description construct (deb bug #528827)
---
 ChangeLog                    |   15 ++
 TODO                         |    4 +
 src/evolution-rss.schemas.in |   14 ++
 src/fetch.c                  |    7 +-
 src/file-gio.c               |   10 +-
 src/network-soup.c           |    3 +-
 src/parser.c                 |   48 +++---
 src/rss-config-factory.c     |   79 +++++------
 src/rss-html-rendering.glade |   77 ++++++++--
 src/rss-ui.glade             |  331 ++++++++++++++++++++++++++++--------------
 src/rss.c                    |   82 ++++++-----
 src/rss.h                    |   22 +---
 12 files changed, 435 insertions(+), 257 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 75205f6..a190770 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2009-05-25  Lucian Langa  <lucilanga gnome org>
+
+	* src/fetch.c (fetch_unblocking): sanitize url before fetching (strip
+	whitespace)
+	* src/file-gio.c (gio_finish_feed): correctly handle errors
+	when fetching files
+	* src/parser.c (layer_find_tag), (parse_channel_line): correctly parse
+	atom description construct (debian bug #528827)
+	* src/rss-config-factory.c (build_dialog_add), (feeds_dialog_add),
+	(delete_response): correctly escape markup text
+	* src/rss-html-rendering.glade: add cookie import option
+	* src/rss.c (browser_write), (mycall), (gecko_click),
+	(finish_feed), (generic_finish_feed), (finish_website),
+	(update_feed_image), (rss_delete_feed), (store_folder_deleted):
+
 2009-05-18  Lucian Langa  <lucilanga gnome org>
 
 	* src/rss-config-factory.c (feeds_dialog_disable),
diff --git a/TODO b/TODO
index 15e567e..d9c1229 100644
--- a/TODO
+++ b/TODO
@@ -58,3 +58,7 @@
 	* display links from content in status bar
 	* grey out disabled folders (feeds)
 	* feed check runtime validation
+	* wrong send and receive count of articles after import
+	* handle 404 for images in comments
+	* possibly prefer content:encoded (CDATA) over description on certiain atom feeds
+	* gtkhtml does not handle script properly
diff --git a/src/evolution-rss.schemas.in b/src/evolution-rss.schemas.in
index 7d75fce..8cd7428 100644
--- a/src/evolution-rss.schemas.in
+++ b/src/evolution-rss.schemas.in
@@ -241,6 +241,20 @@
         </long>
       </locale>
     </schema>
+
+    <schema>
+      <key>/schemas/apps/evolution/evolution-rss/show_comments</key>
+      <applyto>/apps/evolution/evolution-rss/show_comments</applyto>
+      <owner>evolution-rss</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+        <short>Show articles comments</short>
+        <long>
+    	    It will display article's comments by default if present.
+        </long>
+      </locale>
+    </schema>
     
     <schema>
       <key>/schemas/apps/evolution/evolution-rss/use_proxy</key>
diff --git a/src/fetch.c b/src/fetch.c
index 4e03204..46f9a61 100644
--- a/src/fetch.c
+++ b/src/fetch.c
@@ -27,6 +27,7 @@
 #include "file-gio.h"
 #include "network-soup.h"
 #include "fetch.h"
+#define d(x)
 
 GString*
 fetch_blocking(gchar *url, GSList *headers, GString *post,
@@ -73,7 +74,11 @@ fetch_unblocking(gchar *url, NetStatusCallback cb, gpointer data,
 				GError **err)
 {
 	gchar *scheme = NULL;
-	scheme = g_uri_parse_scheme(url);
+	scheme = g_uri_parse_scheme(g_strstrip(url));
+	d(g_print("scheme:%s=>url:%s\n", scheme, url));
+
+	if (!scheme)
+		return FALSE;
 
 	if (!g_ascii_strcasecmp(scheme, "file")) {
 		g_free(scheme);
diff --git a/src/file-gio.c b/src/file-gio.c
index a3eadce..baae14b 100644
--- a/src/file-gio.c
+++ b/src/file-gio.c
@@ -55,11 +55,11 @@ gio_finish_feed (GObject *object, GAsyncResult *res, gpointer user_data)
                                               res,
                                               &file_contents, &file_size,
                                               NULL, NULL);
-        rfmsg->status_code = SOUP_STATUS_OK;
-        rfmsg->body = file_contents;
-        rfmsg->length = file_size;
-        generic_finish_feed(rfmsg, user_data);
-        if (result) {
+	if (result) {
+        	rfmsg->status_code = SOUP_STATUS_OK;
+        	rfmsg->body = file_contents;
+        	rfmsg->length = file_size;
+        	generic_finish_feed(rfmsg, user_data);
                 g_free (file_contents);
         }
         g_free(rfmsg);
diff --git a/src/network-soup.c b/src/network-soup.c
index 4ee5baf..01709b0 100644
--- a/src/network-soup.c
+++ b/src/network-soup.c
@@ -498,7 +498,6 @@ net_get_unblocking(gchar *url,
 		soup_session_async_new();
 			
 	if (rss_soup_jar) {
-		g_print("juvr\n");
 		soup_session_add_feature(soup_sess, SOUP_SESSION_FEATURE(rss_soup_jar));
 	}
 	proxify_session(proxy, soup_sess, url);
@@ -703,5 +702,5 @@ abort_all_soup(void)
 void
 rss_soup_init(void)
 {
-	//rss_soup_jar = soup_cookie_jar_sqlite_new ("/home/cooly/.newcookies.sqlite", FALSE);
+	rss_soup_jar = soup_cookie_jar_sqlite_new ("/home/cooly/.evolution/mail/rss/rss-cookies.sqlite", FALSE);
 }
diff --git a/src/parser.c b/src/parser.c
index b1bfbee..8c76278 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -159,8 +159,9 @@ xml_parse_sux (const char *buf, int len)
         ctxt->vctxt.warning = my_xml_parser_error_handler;
 
         xmlCtxtUseOptions(ctxt, XML_PARSE_DTDLOAD
-                                | XML_PARSE_NOENT
-                                | XML_PARSE_NOCDATA);
+                                | XML_PARSE_NOENT);
+
+//                                | XML_PARSE_NOCDATA);
 
         xmlParseDocument (ctxt);
 
@@ -490,30 +491,29 @@ layer_find_tag (xmlNodePtr node,
 					}
 				}
 			}
-		}
-                if (strcasecmp ((char *)node->name, match)==0) {
-                        if (node->children != NULL) {
-				if (node->children->type == 1			//XML_NODE_ELEMENT
-	/*			|| node->children->type == 3		*/	//XML_NODE_TEXT
-					|| node->children->next != NULL) {
-				d(g_print("NODE DUMP:%s|\n", xmlNodeGetContent(node->children->next)));
-				gchar *nodetype = (gchar *)xmlGetProp(node, (xmlChar *)"type");
-				if (!strcasecmp(nodetype, "xhtml")) {		// test this with "html" or smth else
-				//this looses html entities
- 				len = xmlNodeDump(buf, node->doc, node->children, 0, 0);
-				content = g_strdup_printf("%s", xmlBufferContent(buf));
-				xmlBufferFree(buf);
-				} else
-					content = (char *)xmlNodeGetContent(node->children);
-				if (nodetype)
-					xmlFree(nodetype);
-				return content;
+		} else {		//in case was not a standard module process node normally
+					//above case should handle all modules
+			if (strcasecmp ((char *)node->name, match)==0) {
+				if (node->type == 1) {			//XML_NODE_ELEMENT
+					gchar *nodetype = (gchar *)xmlGetProp(node, (xmlChar *)"type");
+					//we need separate xhtml parsing because of xmlNodegetcontent substitutes html entities
+					if (nodetype && !strcasecmp(nodetype, "xhtml")) {		// test this with "html" or smth else
+						//this looses html entities
+ 						len = xmlNodeDump(buf, node->doc, node, 0, 0);
+						content = g_strdup_printf("%s", xmlBufferContent(buf));
+						xmlBufferFree(buf);
+					} else {
+						content = (char *)xmlNodeGetContent(node);
+					}
+					if (nodetype)
+						xmlFree(nodetype);
+					return content;
                         	} else {
 					xmlBufferFree(buf);
                                 	return fail;
                         	}
 			}
-                }
+		}
                 node = node->next;
         }
 	xmlBufferFree(buf);
@@ -882,11 +882,11 @@ parse_channel_line(xmlNode *top, gchar *feed_name, char *main_date)
 			}
 		}
 		//FIXME this might need xmlFree when namespacing
-		b = layer_find_tag (top, "description",
-				layer_find_tag (top, "content", 
+		b = layer_find_tag (top, "content",			//we prefer content first					  <--
+				layer_find_tag (top, "description", 	//it seems description is rather shorten version of the content, so |
 					layer_find_tag (top, "summary", 
 					NULL)));
-		if (b) 
+		if (b && strlen(b)) 
 			b = g_strstrip(b);
 		else
 	               	b = g_strdup(layer_find (top, "description",
diff --git a/src/rss-config-factory.c b/src/rss-config-factory.c
index 3d441ef..9ddff98 100644
--- a/src/rss-config-factory.c
+++ b/src/rss-config-factory.c
@@ -71,6 +71,27 @@ typedef struct {
         GtkWidget   *check5;
 } UIData;
 
+typedef struct _setupfeed {
+        GladeXML  *gui;
+        GtkWidget *treeview;
+        GtkWidget *add_feed;
+        GtkWidget *check1;
+        GtkWidget *check2;
+        GtkWidget *check3;
+        GtkWidget *check4;
+        GtkWidget *spin;
+        GtkWidget *use_proxy;
+        GtkWidget *host_proxy;
+        GtkWidget *port_proxy;
+        GtkWidget *proxy_details;
+        GtkWidget *details;
+        GtkWidget *import;
+        GtkWidget *import_fs;
+        GtkWidget *export_fs;
+        GtkWidget *export;
+        GtkWidget *combo_hbox;
+} setupfeed;
+
 static void feeds_dialog_edit(GtkDialog *d, gpointer data);
 
 static void
@@ -374,7 +395,7 @@ build_dialog_add(gchar *url, gchar *feed_text)
 
         GtkWidget *entry2 = (GtkWidget *)glade_xml_get_widget (gui, "entry2");
 	if (url != NULL) {
-        	flabel = g_strdup_printf("%s: <b>%s</b>", _("Folder"),
+        	flabel = g_markup_printf_escaped("%s: <b>%s</b>", _("Folder"),
                         lookup_feed_folder(feed_text));
 		gtk_label_set_text(GTK_LABEL(entry2), flabel);
         	gtk_label_set_use_markup(GTK_LABEL(entry2), 1);
@@ -601,15 +622,13 @@ feeds_dialog_add(GtkDialog *d, gpointer data)
 	gtk_widget_show_all(msg_feeds);
         while (gtk_events_pending ())
                 gtk_main_iteration ();
-        if (feed->feed_url && strlen(feed->feed_url))
-        {
+        if (feed->feed_url && strlen(feed->feed_url)) {
                 text = feed->feed_url;
                 feed->feed_url = sanitize_url(feed->feed_url);
                 g_free(text);
                 if (g_hash_table_find(rf->hr,
                                         check_if_match,
-                                        feed->feed_url))
-                {
+                                        feed->feed_url)) {
                            rss_error(NULL, NULL, _("Error adding feed."),
                                            _("Feed already exists!"));
                            goto out;
@@ -638,7 +657,6 @@ rss_delete_rec (CamelStore *store, CamelFolderInfo *fi, CamelException *ex)
                 CamelFolder *folder;
 
                 d(printf ("deleting folder '%s'\n", fi->full_name));
-                printf ("deleting folder '%s'\n", fi->full_name);
 
                 if (!(folder = camel_store_get_folder (store, fi->full_name, 0, ex)))
                         return;
@@ -790,38 +808,12 @@ delete_response(GtkWidget *selector, guint response, gpointer user_data)
         GtkTreeModel     *model;
         GtkTreeIter       iter;
         gchar *name;
-        CamelException ex;
         if (response == GTK_RESPONSE_OK) {
                 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(user_data));
                 if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
                         gtk_tree_model_get (model, &iter, 3, &name, -1);
-                        if (gconf_client_get_bool(rss_gconf, GCONF_KEY_REMOVE_FOLDER, NULL)) {
-                                //delete folder
-                                CamelStore *store = mail_component_peek_local_store(NULL);
-                                gchar *full_path = g_strdup_printf("%s/%s",
-                                                lookup_main_folder(),
-                                                lookup_feed_folder(name));
-                                delete_feed_folder_alloc(lookup_feed_folder(name));
-                                camel_exception_init (&ex);
-                                rss_delete_folders (store, full_path, &ex);
-                                if (camel_exception_is_set (&ex)) {
-                                        e_error_run(NULL,
-                                                "mail:no-delete-folder", full_path, ex.desc, NULL);
-                                        camel_exception_clear (&ex);
-                                }
-                                g_free(full_path);
-                                //also remove status file
-                                gchar *url =  g_hash_table_lookup(rf->hr,
-                                                        g_hash_table_lookup(rf->hrname,
-                                                        name));
-                                gchar *buf = gen_md5(url);
-				gchar *feed_dir = rss_component_peek_base_directory(mail_component_peek());
-                                gchar *feed_name = g_strdup_printf("%s/%s", feed_dir, buf);
-                                g_free(feed_dir);
-                                g_free(buf);
-                                unlink(feed_name);
-                        }
-                        remove_feed_hash(name);
+			rss_delete_feed(name,
+				gconf_client_get_bool(rss_gconf, GCONF_KEY_REMOVE_FOLDER, NULL));
                         g_free(name);
                 }
 		store_redraw(GTK_TREE_VIEW(rf->treeview));
@@ -1052,8 +1044,7 @@ import_one_feed(gchar *url, gchar *title)
 	/* we'll get rid of this as soon as we fetch unblocking */
         if (g_hash_table_find(rf->hr,
                                      check_if_match,
-                                     feed->feed_url))
-        {
+                                     feed->feed_url)) {
                rss_error(NULL, feed->feed_name, _("Error adding feed."),
                                 _("Feed already exists!"));
                return FALSE;
@@ -1181,8 +1172,7 @@ import_opml(gchar *file)
 	while ((src = iterate_import_file(src, &url, &name, type))) {
                 if (url && strlen(url)) {
 		g_print("url:%s\n", url);
-                        if (rf->cancel)
-                        {
+                        if (rf->cancel) {
                                 if (src) xmlFree(src);
                                 rf->cancel = 0;
                                 goto out;
@@ -1210,8 +1200,7 @@ import_opml(gchar *file)
                         save_gconf_feed();
                         if (src)
                                 xmlFree(src);
-                }
-                else
+                } else
                         src = html_find(src, "outline");
 
         }
@@ -1227,8 +1216,7 @@ select_file_response(GtkWidget *selector, guint response, gpointer user_data)
 {
         if (response == GTK_RESPONSE_OK) {
                 char *name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (selector));
-                if (name)
-                {
+                if (name) {
                         gtk_widget_hide(selector);
                         import_opml(name);
                         g_free(name);
@@ -1988,6 +1976,7 @@ rss_config_control_new (void)
 	sf->check1 = glade_xml_get_widget(sf->gui, "checkbutton1");
 	sf->check2 = glade_xml_get_widget(sf->gui, "checkbutton2");
 	sf->check3 = glade_xml_get_widget(sf->gui, "checkbutton3");
+	sf->check4 = glade_xml_get_widget(sf->gui, "checkbutton4");
 	sf->spin = glade_xml_get_widget(sf->gui, "spinbutton1");
 
  	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->check1), 
@@ -2011,6 +2000,12 @@ rss_config_control_new (void)
 		"clicked", 
 		G_CALLBACK(start_check_cb), 
 		GCONF_KEY_DISPLAY_SUMMARY);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sf->check4),
+        	gconf_client_get_bool(rss_gconf, GCONF_KEY_SHOW_COMMENTS, NULL));
+	g_signal_connect(sf->check4, 
+		"clicked", 
+		G_CALLBACK(start_check_cb), 
+		GCONF_KEY_SHOW_COMMENTS);
 
 
 #if (EVOLUTION_VERSION < 21900)		// include devel too
diff --git a/src/rss-html-rendering.glade b/src/rss-html-rendering.glade
index c6e238b..4103ac0 100644
--- a/src/rss-html-rendering.glade
+++ b/src/rss-html-rendering.glade
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--*- mode: xml -*-->
+<?xml version="1.0"?>
 <glade-interface>
+  <!-- interface-requires gtk+ 2.16 -->
+  <!-- interface-naming-policy toplevel-contextual -->
   <widget class="GtkWindow" id="window1">
     <child>
       <widget class="GtkVBox" id="settingsbox">
@@ -10,7 +10,7 @@
           <widget class="GtkFrame" id="html-rendering">
             <property name="visible">True</property>
             <property name="label_xalign">0</property>
-            <property name="shadow_type">GTK_SHADOW_NONE</property>
+            <property name="shadow_type">none</property>
             <child>
               <widget class="GtkAlignment" id="alignment1">
                 <property name="visible">True</property>
@@ -34,6 +34,7 @@
                           <packing>
                             <property name="expand">False</property>
                             <property name="fill">False</property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
@@ -43,6 +44,7 @@
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">False</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
@@ -50,20 +52,23 @@
                         <property name="visible">True</property>
                         <child>
                           <widget class="GtkCheckButton" id="checkbutton1">
-                            <property name="can_focus">True</property>
                             <property name="label" translatable="yes">Block pop-up windows</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
+                          <packing>
+                            <property name="position">0</property>
+                          </packing>
                         </child>
                         <child>
                           <widget class="GtkCheckButton" id="enable_java">
+                            <property name="label" translatable="yes">Enable Java</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="label" translatable="yes">Enable Java</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
                           <packing>
@@ -72,17 +77,48 @@
                         </child>
                         <child>
                           <widget class="GtkCheckButton" id="enable_js">
+                            <property name="label" translatable="yes">Enable JavaScript</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="label" translatable="yes">Enable JavaScript</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
                           <packing>
                             <property name="position">2</property>
                           </packing>
                         </child>
+                        <child>
+                          <widget class="GtkHBox" id="hbox3">
+                            <property name="visible">True</property>
+                            <child>
+                              <widget class="GtkCheckButton" id="checkbutton2">
+                                <property name="label" translatable="yes">Accept cookies from sites</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="draw_indicator">True</property>
+                              </widget>
+                              <packing>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkButton" id="button1">
+                                <property name="label" translatable="yes">Import Cookies</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                              </widget>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
                       </widget>
                       <packing>
                         <property name="position">1</property>
@@ -100,6 +136,7 @@
                           </widget>
                           <packing>
                             <property name="expand">False</property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
@@ -146,12 +183,15 @@
               </packing>
             </child>
           </widget>
+          <packing>
+            <property name="position">0</property>
+          </packing>
         </child>
         <child>
           <widget class="GtkFrame" id="frame1">
             <property name="visible">True</property>
             <property name="label_xalign">0</property>
-            <property name="shadow_type">GTK_SHADOW_NONE</property>
+            <property name="shadow_type">none</property>
             <child>
               <widget class="GtkAlignment" id="alignment2">
                 <property name="visible">True</property>
@@ -161,13 +201,16 @@
                     <property name="visible">True</property>
                     <child>
                       <widget class="GtkCheckButton" id="status_icon">
+                        <property name="label" translatable="yes">Show icon in notification area</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="label" translatable="yes">Show icon in notification area</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
                         <property name="draw_indicator">True</property>
                       </widget>
+                      <packing>
+                        <property name="position">0</property>
+                      </packing>
                     </child>
                     <child>
                       <widget class="GtkAlignment" id="alignment3">
@@ -175,11 +218,11 @@
                         <property name="xscale">0.80000001192092896</property>
                         <child>
                           <widget class="GtkCheckButton" id="blink_icon">
+                            <property name="label" translatable="yes">Blink icon in notification area</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="label" translatable="yes">Blink icon in notification area</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
                         </child>
@@ -190,11 +233,11 @@
                     </child>
                     <child>
                       <widget class="GtkCheckButton" id="feed_icon">
+                        <property name="label" translatable="yes">Show feed icon</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="label" translatable="yes">Show feed icon</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
                         <property name="draw_indicator">True</property>
                       </widget>
                       <packing>
diff --git a/src/rss-ui.glade b/src/rss-ui.glade
index 605db53..1a0423c 100644
--- a/src/rss-ui.glade
+++ b/src/rss-ui.glade
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--*- mode: xml -*-->
+<?xml version="1.0"?>
 <glade-interface>
+  <!-- interface-requires gtk+ 2.16 -->
+  <!-- interface-naming-policy toplevel-contextual -->
   <widget class="GtkWindow" id="rss-config-control">
     <property name="title" translatable="yes">window1</property>
     <child>
@@ -21,31 +21,34 @@
                   <widget class="GtkScrolledWindow" id="scrolledwindow4">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                    <property name="shadow_type">GTK_SHADOW_IN</property>
+                    <property name="hscrollbar_policy">automatic</property>
+                    <property name="vscrollbar_policy">automatic</property>
+                    <property name="shadow_type">in</property>
                     <child>
                       <widget class="GtkTreeView" id="feeds-treeview">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <accessibility>
-                          <atkproperty name="AtkObject::accessible_name" translatable="yes">Certificates Table</atkproperty>
+                          <atkproperty name="AtkObject::accessible-name" translatable="yes">Certificates Table</atkproperty>
                         </accessibility>
                       </widget>
                     </child>
                   </widget>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
                 </child>
                 <child>
                   <widget class="GtkVButtonBox" id="vbuttonbox1">
                     <property name="visible">True</property>
                     <property name="spacing">6</property>
-                    <property name="layout_style">GTK_BUTTONBOX_START</property>
+                    <property name="layout_style">start</property>
                     <child>
                       <widget class="GtkButton" id="feed-add-button">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="can_default">True</property>
-                        <property name="response_id">0</property>
+                        <property name="receives_default">False</property>
                         <child>
                           <widget class="GtkAlignment" id="alignment5">
                             <property name="visible">True</property>
@@ -63,6 +66,7 @@
                                   <packing>
                                     <property name="expand">False</property>
                                     <property name="fill">False</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -82,13 +86,18 @@
                           </widget>
                         </child>
                       </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
                     </child>
                     <child>
                       <widget class="GtkButton" id="feed-edit-button">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="can_default">True</property>
-                        <property name="response_id">0</property>
+                        <property name="receives_default">False</property>
                         <child>
                           <widget class="GtkAlignment" id="alignment6">
                             <property name="visible">True</property>
@@ -106,6 +115,7 @@
                                   <packing>
                                     <property name="expand">False</property>
                                     <property name="fill">False</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -126,19 +136,23 @@
                         </child>
                       </widget>
                       <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
                         <property name="position">1</property>
                       </packing>
                     </child>
                     <child>
                       <widget class="GtkButton" id="feed-delete-button">
+                        <property name="label">gtk-delete</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="can_default">True</property>
-                        <property name="label">gtk-delete</property>
+                        <property name="receives_default">False</property>
                         <property name="use_stock">True</property>
-                        <property name="response_id">0</property>
                       </widget>
                       <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
                         <property name="position">2</property>
                       </packing>
                     </child>
@@ -147,7 +161,7 @@
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="can_default">True</property>
-                        <property name="response_id">0</property>
+                        <property name="receives_default">False</property>
                         <child>
                           <widget class="GtkAlignment" id="alignment7">
                             <property name="visible">True</property>
@@ -165,6 +179,7 @@
                                   <packing>
                                     <property name="expand">False</property>
                                     <property name="fill">False</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -185,19 +200,23 @@
                         </child>
                       </widget>
                       <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
                         <property name="position">3</property>
                       </packing>
                     </child>
                     <child>
                       <widget class="GtkButton" id="export">
+                        <property name="label" translatable="yes">Export</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="can_default">True</property>
-                        <property name="label" translatable="yes">Export</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
                       </widget>
                       <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
                         <property name="position">4</property>
                       </packing>
                     </child>
@@ -208,6 +227,9 @@
                   </packing>
                 </child>
               </widget>
+              <packing>
+                <property name="position">0</property>
+              </packing>
             </child>
           </widget>
         </child>
@@ -217,8 +239,8 @@
             <property name="label" translatable="yes">Feeds</property>
           </widget>
           <packing>
-            <property name="type">tab</property>
             <property name="tab_fill">False</property>
+            <property name="type">tab</property>
           </packing>
         </child>
         <child>
@@ -237,6 +259,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
@@ -254,6 +277,7 @@
                           <packing>
                             <property name="expand">False</property>
                             <property name="fill">False</property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
@@ -262,6 +286,7 @@
                       </widget>
                       <packing>
                         <property name="expand">False</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
@@ -269,15 +294,16 @@
                         <property name="visible">True</property>
                         <child>
                           <widget class="GtkCheckButton" id="checkbutton7">
-                            <property name="can_focus">True</property>
                             <property name="label" translatable="yes">Enable JavaScript</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
                           <packing>
                             <property name="expand">False</property>
                             <property name="fill">False</property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
                       </widget>
@@ -288,10 +314,10 @@
                     </child>
                     <child>
                       <widget class="GtkCheckButton" id="checkbutton8">
-                        <property name="can_focus">True</property>
                         <property name="label" translatable="yes">Enable Plugins</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
                         <property name="draw_indicator">True</property>
                       </widget>
                       <packing>
@@ -316,6 +342,9 @@
                   </packing>
                 </child>
               </widget>
+              <packing>
+                <property name="position">0</property>
+              </packing>
             </child>
           </widget>
           <packing>
@@ -327,9 +356,9 @@
             <property name="label" translatable="yes">HTML</property>
           </widget>
           <packing>
-            <property name="type">tab</property>
             <property name="position">1</property>
             <property name="tab_fill">False</property>
+            <property name="type">tab</property>
           </packing>
         </child>
         <child>
@@ -350,6 +379,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
@@ -360,16 +390,17 @@
                         <property name="visible">True</property>
                         <child>
                           <widget class="GtkCheckButton" id="checkbutton1">
+                            <property name="label" translatable="yes">Check for new articles every</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="label" translatable="yes">Check for new articles every</property>
+                            <property name="receives_default">False</property>
                             <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
                             <property name="draw_indicator">True</property>
                           </widget>
                           <packing>
                             <property name="expand">False</property>
                             <property name="fill">False</property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
@@ -400,15 +431,16 @@
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">False</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
                       <widget class="GtkCheckButton" id="checkbutton2">
+                        <property name="label" translatable="yes">Check for new articles at startup</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="label" translatable="yes">Check for new articles at startup</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
                         <property name="draw_indicator">True</property>
                       </widget>
                       <packing>
@@ -419,11 +451,11 @@
                     </child>
                     <child>
                       <widget class="GtkCheckButton" id="checkbutton3">
+                        <property name="label" translatable="yes">By default show article summary instead of webpage</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="label" translatable="yes">By default show article summary instead of webpage</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
                         <property name="draw_indicator">True</property>
                       </widget>
                       <packing>
@@ -432,12 +464,29 @@
                         <property name="position">2</property>
                       </packing>
                     </child>
+                    <child>
+                      <widget class="GtkCheckButton" id="checkbutton4">
+                        <property name="label" translatable="yes">Show article comments</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="draw_indicator">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">3</property>
+                      </packing>
+                    </child>
                   </widget>
                   <packing>
                     <property name="position">1</property>
                   </packing>
                 </child>
               </widget>
+              <packing>
+                <property name="position">0</property>
+              </packing>
             </child>
           </widget>
           <packing>
@@ -450,9 +499,9 @@
             <property name="label" translatable="yes">Setup</property>
           </widget>
           <packing>
-            <property name="type">tab</property>
             <property name="position">2</property>
             <property name="tab_fill">False</property>
+            <property name="type">tab</property>
           </packing>
         </child>
         <child>
@@ -466,16 +515,17 @@
                 <property name="homogeneous">True</property>
                 <child>
                   <widget class="GtkCheckButton" id="use_proxy">
+                    <property name="label" translatable="yes">Use Proxy</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
-                    <property name="label" translatable="yes">Use Proxy</property>
+                    <property name="receives_default">False</property>
                     <property name="use_underline">True</property>
-                    <property name="response_id">0</property>
                     <property name="draw_indicator">True</property>
                   </widget>
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
@@ -486,15 +536,6 @@
                     <property name="column_spacing">5</property>
                     <property name="row_spacing">5</property>
                     <child>
-                      <placeholder/>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                    <child>
                       <widget class="GtkLabel" id="label84">
                         <property name="visible">True</property>
                         <property name="label" translatable="yes">HTTP proxy:</property>
@@ -542,11 +583,11 @@
                     </child>
                     <child>
                       <widget class="GtkButton" id="details">
+                        <property name="label" translatable="yes">Details</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="label" translatable="yes">Details</property>
+                        <property name="receives_default">False</property>
                         <property name="use_underline">True</property>
-                        <property name="response_id">0</property>
                       </widget>
                       <packing>
                         <property name="left_attach">4</property>
@@ -581,6 +622,15 @@
                         <property name="y_options"></property>
                       </packing>
                     </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
                   </widget>
                   <packing>
                     <property name="position">1</property>
@@ -589,6 +639,7 @@
               </widget>
               <packing>
                 <property name="expand">False</property>
+                <property name="position">0</property>
               </packing>
             </child>
           </widget>
@@ -601,9 +652,9 @@
             <property name="label" translatable="yes">Network</property>
           </widget>
           <packing>
-            <property name="type">tab</property>
             <property name="position">3</property>
             <property name="tab_fill">False</property>
+            <property name="type">tab</property>
           </packing>
         </child>
       </widget>
@@ -612,7 +663,7 @@
   <widget class="GtkDialog" id="http-proxy-details">
     <property name="title" translatable="yes">HTTP Proxy Details</property>
     <property name="modal">True</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="type_hint">dialog</property>
     <child internal-child="vbox">
       <widget class="GtkVBox" id="dialog-vbox4">
         <property name="visible">True</property>
@@ -622,16 +673,17 @@
             <property name="border_width">15</property>
             <child>
               <widget class="GtkCheckButton" id="proxy_auth">
+                <property name="label" translatable="yes">Use authentication</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="label" translatable="yes">Use authentication</property>
+                <property name="receives_default">False</property>
                 <property name="use_underline">True</property>
-                <property name="response_id">0</property>
                 <property name="draw_indicator">True</property>
               </widget>
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
+                <property name="position">0</property>
               </packing>
             </child>
             <child>
@@ -702,34 +754,44 @@
         <child internal-child="action_area">
           <widget class="GtkHButtonBox" id="dialog-action_area4">
             <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <property name="layout_style">end</property>
             <child>
               <widget class="GtkButton" id="helpbutton1">
+                <property name="label">gtk-help</property>
+                <property name="response_id">-11</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">gtk-help</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">-11</property>
               </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
             </child>
             <child>
               <widget class="GtkButton" id="closebutton2">
+                <property name="label">gtk-close</property>
+                <property name="response_id">-7</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">gtk-close</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">-7</property>
               </widget>
               <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
                 <property name="position">1</property>
               </packing>
             </child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </widget>
@@ -740,7 +802,7 @@
     <property name="title" translatable="yes">Select import file</property>
     <property name="modal">True</property>
     <property name="destroy_with_parent">True</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="type_hint">dialog</property>
     <property name="show_hidden">True</property>
     <child internal-child="vbox">
       <widget class="GtkVBox" id="dialog-vbox5">
@@ -749,35 +811,45 @@
         <child internal-child="action_area">
           <widget class="GtkHButtonBox" id="dialog-action_area5">
             <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <property name="layout_style">end</property>
             <child>
               <widget class="GtkButton" id="button1">
+                <property name="label">gtk-cancel</property>
+                <property name="response_id">-6</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">gtk-cancel</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">-6</property>
               </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
             </child>
             <child>
               <widget class="GtkButton" id="button2">
+                <property name="label">gtk-open</property>
+                <property name="response_id">-5</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
                 <property name="has_default">True</property>
-                <property name="label">gtk-open</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">-5</property>
               </widget>
               <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
                 <property name="position">1</property>
               </packing>
             </child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </widget>
@@ -785,7 +857,7 @@
   </widget>
   <widget class="GtkDialog" id="delete_feed_confirm">
     <property name="title" translatable="yes">Delete feed?</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="type_hint">dialog</property>
     <child internal-child="vbox">
       <widget class="GtkVBox" id="dialog-vbox6">
         <property name="visible">True</property>
@@ -799,15 +871,16 @@
               </widget>
               <packing>
                 <property name="fill">False</property>
+                <property name="position">0</property>
               </packing>
             </child>
             <child>
               <widget class="GtkCheckButton" id="checkbutton6">
+                <property name="label" translatable="yes">Remove folder contents</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="label" translatable="yes">Remove folder contents</property>
+                <property name="receives_default">False</property>
                 <property name="use_underline">True</property>
-                <property name="response_id">0</property>
                 <property name="draw_indicator">True</property>
               </widget>
               <packing>
@@ -824,34 +897,44 @@
         <child internal-child="action_area">
           <widget class="GtkHButtonBox" id="dialog-action_area6">
             <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <property name="layout_style">end</property>
             <child>
               <widget class="GtkButton" id="okbutton2">
+                <property name="label">gtk-delete</property>
+                <property name="response_id">-8</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">gtk-delete</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">-8</property>
               </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
             </child>
             <child>
               <widget class="GtkButton" id="cancelbutton2">
+                <property name="label">Do not delete</property>
+                <property name="response_id">-9</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">Do not delete</property>
+                <property name="receives_default">False</property>
                 <property name="use_underline">True</property>
-                <property name="response_id">-9</property>
               </widget>
               <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
                 <property name="position">1</property>
               </packing>
             </child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </widget>
@@ -863,10 +946,10 @@
     <property name="resizable">False</property>
     <property name="modal">True</property>
     <property name="destroy_with_parent">True</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="show_hidden">True</property>
+    <property name="type_hint">dialog</property>
     <property name="local_only">False</property>
-    <property name="action">GTK_FILE_CHOOSER_ACTION_SAVE</property>
+    <property name="show_hidden">True</property>
+    <property name="action">save</property>
     <child internal-child="vbox">
       <widget class="GtkVBox" id="vbox26">
         <property name="visible">True</property>
@@ -874,35 +957,45 @@
         <child internal-child="action_area">
           <widget class="GtkHButtonBox" id="hbuttonbox1">
             <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <property name="layout_style">end</property>
             <child>
               <widget class="GtkButton" id="button3">
+                <property name="label">gtk-cancel</property>
+                <property name="response_id">-6</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">gtk-cancel</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">-6</property>
               </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
             </child>
             <child>
               <widget class="GtkButton" id="button4">
+                <property name="label">gtk-save</property>
+                <property name="response_id">-5</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
                 <property name="has_default">True</property>
-                <property name="label">gtk-save</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">-5</property>
               </widget>
               <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
                 <property name="position">1</property>
               </packing>
             </child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </widget>
@@ -911,9 +1004,9 @@
   <widget class="GtkDialog" id="feed_dialog">
     <property name="border_width">5</property>
     <property name="resizable">False</property>
-    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+    <property name="window_position">center-on-parent</property>
     <property name="destroy_with_parent">True</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="type_hint">dialog</property>
     <property name="has_separator">False</property>
     <child internal-child="vbox">
       <widget class="GtkVBox" id="dialog-vbox9">
@@ -934,6 +1027,7 @@
                   </widget>
                   <packing>
                     <property name="expand">False</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
                 <child>
@@ -946,6 +1040,9 @@
                   </packing>
                 </child>
               </widget>
+              <packing>
+                <property name="position">0</property>
+              </packing>
             </child>
             <child>
               <widget class="GtkLabel" id="entry2">
@@ -975,24 +1072,25 @@
                             <property name="border_width">10</property>
                             <child>
                               <widget class="GtkCheckButton" id="enabled_check">
+                                <property name="label" translatable="yes">Enabled</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Enabled</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
                               <packing>
                                 <property name="expand">False</property>
+                                <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <widget class="GtkCheckButton" id="validate_check">
+                                <property name="label" translatable="yes">Validate</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Validate</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
                               <packing>
@@ -1002,11 +1100,11 @@
                             </child>
                             <child>
                               <widget class="GtkCheckButton" id="html_check">
+                                <property name="label" translatable="yes">Display only feed summary</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Display only feed summary</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
                               <packing>
@@ -1022,8 +1120,8 @@
                             <property name="label" translatable="yes">General</property>
                           </widget>
                           <packing>
-                            <property name="type">tab</property>
                             <property name="tab_fill">False</property>
+                            <property name="type">tab</property>
                           </packing>
                         </child>
                         <child>
@@ -1032,16 +1130,17 @@
                             <property name="border_width">10</property>
                             <child>
                               <widget class="GtkRadioButton" id="ttl_global">
+                                <property name="label" translatable="yes">Use global update interval</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Use global update interval</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="active">True</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
                               <packing>
                                 <property name="expand">False</property>
+                                <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
@@ -1049,16 +1148,17 @@
                                 <property name="visible">True</property>
                                 <child>
                                   <widget class="GtkRadioButton" id="ttl">
+                                    <property name="label" translatable="yes">Update in</property>
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="label" translatable="yes">Update in</property>
+                                    <property name="receives_default">False</property>
                                     <property name="use_underline">True</property>
-                                    <property name="response_id">0</property>
                                     <property name="draw_indicator">True</property>
                                     <property name="group">ttl_global</property>
                                   </widget>
                                   <packing>
                                     <property name="expand">False</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -1094,11 +1194,11 @@ days</property>
                             </child>
                             <child>
                               <widget class="GtkRadioButton" id="ttl_disabled">
+                                <property name="label" translatable="yes">Do no update feed</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Do no update feed</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="active">True</property>
                                 <property name="draw_indicator">True</property>
                                 <property name="group">ttl_global</property>
@@ -1119,9 +1219,9 @@ days</property>
                             <property name="label" translatable="yes">Update</property>
                           </widget>
                           <packing>
-                            <property name="type">tab</property>
                             <property name="position">1</property>
                             <property name="tab_fill">False</property>
+                            <property name="type">tab</property>
                           </packing>
                         </child>
                         <child>
@@ -1130,29 +1230,35 @@ days</property>
                             <property name="border_width">10</property>
                             <child>
                               <widget class="GtkRadioButton" id="storage_rb1">
+                                <property name="label" translatable="yes">Do not delete feeds</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Do not delete feeds</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="active">True</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
+                              <packing>
+                                <property name="position">0</property>
+                              </packing>
                             </child>
                             <child>
                               <widget class="GtkHBox" id="hbox8">
                                 <property name="visible">True</property>
                                 <child>
                                   <widget class="GtkRadioButton" id="storage_rb2">
+                                    <property name="label" translatable="yes">Delete all but the last</property>
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="label" translatable="yes">Delete all but the last</property>
+                                    <property name="receives_default">False</property>
                                     <property name="use_underline">True</property>
-                                    <property name="response_id">0</property>
                                     <property name="active">True</property>
                                     <property name="draw_indicator">True</property>
                                     <property name="group">storage_rb1</property>
                                   </widget>
+                                  <packing>
+                                    <property name="position">0</property>
+                                  </packing>
                                 </child>
                                 <child>
                                   <widget class="GtkSpinButton" id="storage_sb1">
@@ -1184,15 +1290,18 @@ days</property>
                                 <property name="visible">True</property>
                                 <child>
                                   <widget class="GtkRadioButton" id="storage_rb3">
+                                    <property name="label" translatable="yes">Delete articles older than</property>
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="label" translatable="yes">Delete articles older than</property>
+                                    <property name="receives_default">False</property>
                                     <property name="use_underline">True</property>
-                                    <property name="response_id">0</property>
                                     <property name="active">True</property>
                                     <property name="draw_indicator">True</property>
                                     <property name="group">storage_rb1</property>
                                   </widget>
+                                  <packing>
+                                    <property name="position">0</property>
+                                  </packing>
                                 </child>
                                 <child>
                                   <widget class="GtkSpinButton" id="storage_sb2">
@@ -1221,11 +1330,11 @@ days</property>
                             </child>
                             <child>
                               <widget class="GtkCheckButton" id="storage_unread">
+                                <property name="label" translatable="yes">Always delete unread articles</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Always delete unread articles</property>
+                                <property name="receives_default">False</property>
                                 <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
                               <packing>
@@ -1243,9 +1352,9 @@ days</property>
                             <property name="label" translatable="yes">Storage</property>
                           </widget>
                           <packing>
-                            <property name="type">tab</property>
                             <property name="position">2</property>
                             <property name="tab_fill">False</property>
+                            <property name="type">tab</property>
                           </packing>
                         </child>
                       </widget>
@@ -1277,32 +1386,40 @@ days</property>
         <child internal-child="action_area">
           <widget class="GtkHButtonBox" id="dialog-action_area9">
             <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <property name="layout_style">end</property>
             <child>
               <widget class="GtkButton" id="cancel_button">
+                <property name="label">gtk-cancel</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="label">gtk-cancel</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">0</property>
               </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
             </child>
             <child>
               <widget class="GtkButton" id="ok_button">
+                <property name="label">gtk-ok</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="label">gtk-ok</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="response_id">0</property>
               </widget>
               <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
                 <property name="position">1</property>
               </packing>
             </child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </widget>
diff --git a/src/rss.c b/src/rss.c
index d58f9da..16cf9bf 100644
--- a/src/rss.c
+++ b/src/rss.c
@@ -153,7 +153,7 @@ GQueue *status_msg;
 gchar *flat_status_msg;
 GPtrArray *filter_uids;
 
-static CamelDataCache *http_cache;
+static CamelDataCache *http_cache = NULL;
 
 static volatile int org_gnome_rss_controls_counter_id = 0;
 
@@ -442,7 +442,7 @@ statuscb(NetStatusType status, gpointer statusdata, gpointer data)
 			gtk_progress_bar_set_fraction((GtkProgressBar *)rf->progress_bar, fraction);
 		}
 		if (rf->sr_feed) {
-			gchar *furl = g_strdup_printf("<b>%s</b>: %s", _("Feed"), (char *)data);
+			gchar *furl = g_markup_printf_escaped("<b>%s</b>: %s", _("Feed"), (char *)data);
 			gtk_label_set_markup (GTK_LABEL (rf->sr_feed), furl);
 			g_free(furl);
 		}
@@ -473,16 +473,19 @@ browser_write(gchar *string, gint length, gchar *base)
 	switch (engine) {
 	case 2:
 #ifdef HAVE_GECKO
+	gtk_moz_embed_open_stream(GTK_MOZ_EMBED(rf->mozembed),
+			base, "text/html");
 	while (len > 0) {
-	if (len > 4096) {
-		gtk_moz_embed_append_data(GTK_MOZ_EMBED(rf->mozembed),
-			str, 4096);
-		str+=4096;
-	} else
-		gtk_moz_embed_append_data(GTK_MOZ_EMBED(rf->mozembed),
-		str, len);
-		len-=4096;
+		if (len > 4096) {
+			gtk_moz_embed_append_data(GTK_MOZ_EMBED(rf->mozembed),
+				str, 4096);
+			str+=4096;
+		} else
+			gtk_moz_embed_append_data(GTK_MOZ_EMBED(rf->mozembed),
+				str, len);
+	len-=4096;
 	}
+	gtk_moz_embed_close_stream(GTK_MOZ_EMBED(rf->mozembed));
 #endif
 	break;
 	case 1:
@@ -1326,13 +1329,8 @@ mycall (GtkWidget *widget, GtkAllocation *event, gpointer data)
 		if (po->mozembedwindow && rf->mozembed)
 			if(GTK_IS_WIDGET(po->mozembedwindow) && height > 0)
 			{
-#ifdef HAVE_GECKO
-				if (engine == 2)
-					gtk_moz_embed_open_stream(GTK_MOZ_EMBED(rf->mozembed),
-		    					po->website, "text/html");
-#endif
-		//browser_write("test", 4);
 				if (!browser_fetching) {
+					browser_write("Formatting...", 13, "file:///");
 					browser_fetching=1;
 					fetch_unblocking(
 						po->website,
@@ -1543,7 +1541,7 @@ gecko_click(GtkMozEmbed *mozembed, gpointer dom_event, gpointer user_data)
 	if (button == 0)
 		gtk_moz_embed_load_url(GTK_MOZ_EMBED(rf->mozembed), link);
 	g_print("button:%d\n", button);
-	return TRUE;
+	return FALSE;
 }
 #endif
 
@@ -1750,8 +1748,7 @@ pfree(EMFormatHTMLPObject *o)
 	}
 	guint engine = gconf_client_get_int(rss_gconf, GCONF_KEY_HTML_RENDER, NULL);
 #ifdef HAVE_GECKO
-	if (engine == 2)
-	{
+	if (engine == 2) {
 		gtk_moz_embed_stop_load(GTK_MOZ_EMBED(rf->mozembed));
 //		gtk_moz_embed_pop_startup();
 	}
@@ -1977,7 +1974,8 @@ render_body:    if (category)
                         	frame_colour & 0xffffff, content_colour & 0xffffff, text_colour & 0xffffff,
                                 buff);
 
-		if (comments) {
+		if (comments && 
+  			gconf_client_get_bool (rss_gconf, GCONF_KEY_SHOW_COMMENTS, NULL)) {
 			if (commstream) {
 			camel_stream_printf (fstream, 
                         	"<div style=\"border: solid #%06x 0px; background-color: #%06x; padding: 2px; color: #%06x;\">",
@@ -2613,7 +2611,7 @@ generic_finish_feed(rfMessage *msg, gpointer user_data)
 
 #ifdef EVOLUTION_2_12
 	if (rf->sr_feed && !deleted) {
-		gchar *furl = g_strdup_printf("<b>%s</b>: %s", _("Feed"), (gchar *)user_data);
+		gchar *furl = g_markup_printf_escaped("<b>%s</b>: %s", _("Feed"), (gchar *)user_data);
 		gtk_label_set_markup (GTK_LABEL (rf->sr_feed), furl);
 		gtk_label_set_justify(GTK_LABEL (rf->sr_feed), GTK_JUSTIFY_LEFT);
 		g_free(furl);
@@ -2711,10 +2709,6 @@ finish_website (SoupSession *soup_sess, SoupMessage *msg, gpointer user_data)
 	g_print("len:%d\n", len);
 	if (len>0) {
 		browser_write(str, len, user_data);
-#ifdef HAVE_GECKO
-		if (engine == 2)
-			gtk_moz_embed_close_stream(GTK_MOZ_EMBED(rf->mozembed));
-#endif
 		g_string_free(response, 1);
 //		gtk_widget_show(rf->mozembed);
 	}
@@ -3039,6 +3033,7 @@ void
 update_feed_image(gchar *image, gchar *key)
 {
         GError *err = NULL;
+	gchar *url = NULL;
 //	if (!image)
 //		return;
   //      g_return_if_fail (image != NULL);
@@ -3064,7 +3059,9 @@ update_feed_image(gchar *image, gchar *key)
 			return;
 		}
 	} else {
-		gchar *url = g_hash_table_lookup(rf->hr, key);
+		url = g_hash_table_lookup(rf->hr, key);
+		if (!url)
+			return;
 		gchar *server = get_server_from_uri(url);
 		fetch_unblocking(
 			server,
@@ -3180,7 +3177,7 @@ check_feed_folder(gchar *folder_name)
 }
 
 void
-rss_delete_feed(gchar *name)
+rss_delete_feed(gchar *name, gboolean folder)
 {
         CamelException ex;
         CamelStore *store = mail_component_peek_local_store(NULL);
@@ -3197,16 +3194,18 @@ rss_delete_feed(gchar *name)
         }
         g_free(full_path);
         //also remove status file
-        gchar *url =  g_hash_table_lookup(rf->hr,
-                        g_hash_table_lookup(rf->hrname,
-                        name));
+        gchar *tkey = g_hash_table_lookup(rf->hrname, name);
+	if (!tkey)
+		return;
+        gchar *url =  g_hash_table_lookup(rf->hr, tkey);
         gchar *buf = gen_md5(url);
         gchar *feed_dir = rss_component_peek_base_directory(mail_component_peek());
         gchar *feed_name = g_strdup_printf("%s/%s", feed_dir, buf);
         g_free(feed_dir);
         g_free(buf);
         unlink(feed_name);
-        remove_feed_hash(name);
+	if (folder)
+		remove_feed_hash(name);
         save_gconf_feed();
 }
 
@@ -3215,7 +3214,7 @@ store_folder_deleted(CamelObject *o, void *event_data, void *data)
 {
 	CamelFolderInfo *info = event_data;
 	printf("Folder deleted '%s'\n", info->name);
-	rss_delete_feed(info->name);
+	rss_delete_feed(info->name, 1);
 }
 
 static void
@@ -4350,26 +4349,31 @@ fetch_image(gchar *url, gchar *link)
 	if (!url)
 		return NULL;
 	if (strstr(url, "://") == NULL) {
-		if (*url == '/') {
-		tmpurl = g_strconcat(get_server_from_uri(link), "/", url, NULL);
-		g_print("fetch_image() tmpurl:%s\n", tmpurl);
-		}
-		if (*url == '.')
+		if (*url == '.') //test case when url begins with ".."
 			tmpurl = g_strconcat(g_path_get_dirname(link), "/", url, NULL);
+		else {
+			if (*url == '/')
+				tmpurl = g_strconcat(get_server_from_uri(link), "/", url, NULL);
+			else	//url is relative (does not begin with / or .)
+				tmpurl = g_strconcat(g_path_get_dirname(link), "/", url, NULL);
+		}
 	} else {
 		tmpurl = g_strdup(url);
 	}
+	d(g_print("fetch_image() tmpurl:%s\n", tmpurl));
 	gchar *feed_dir = g_build_path("/", rss_component_peek_base_directory(mail_component_peek()), "static", NULL);
 	if (!g_file_test(feed_dir, G_FILE_TEST_EXISTS))
 	    g_mkdir_with_parents (feed_dir, 0755);
 	http_cache = camel_data_cache_new(feed_dir, 0, NULL);
+	if (!http_cache)
+		return NULL;
 	g_free(feed_dir);
 	stream = camel_data_cache_get(http_cache, HTTP_CACHE_PATH, tmpurl, NULL);
 	if (!stream) {
-		g_print("image cache MISS\n");
+		d(g_print("image cache MISS\n"));
 		stream = camel_data_cache_add(http_cache, HTTP_CACHE_PATH, tmpurl, NULL);
 	} else 
-		g_print("image cache HIT\n");
+		d(g_print("image cache HIT\n"));
 
 	fetch_unblocking(tmpurl,
                        	        textcb,
diff --git a/src/rss.h b/src/rss.h
index 5f0663b..7e48a0b 100644
--- a/src/rss.h
+++ b/src/rss.h
@@ -162,6 +162,7 @@ typedef struct _rssfeed {
 #define GCONF_KEY_START_CHECK "/apps/evolution/evolution-rss/startup_check"
 #define GCONF_KEY_REP_CHECK "/apps/evolution/evolution-rss/rep_check"
 #define GCONF_KEY_REP_CHECK_TIMEOUT "/apps/evolution/evolution-rss/rep_check_timeout"
+#define GCONF_KEY_SHOW_COMMENTS "/apps/evolution/evolution-rss/show_comments"
 #define GCONF_KEY_REMOVE_FOLDER "/apps/evolution/evolution-rss/remove_folder"
 #define GCONF_KEY_HTML_RENDER "/apps/evolution/evolution-rss/html_render"
 #define GCONF_KEY_HTML_JS "/apps/evolution/evolution-rss/html_js"
@@ -202,26 +203,6 @@ typedef struct USERPASS {
 	gchar *password;
 } userpass;
 
-typedef struct _setupfeed {
-	GladeXML  *gui;
-	GtkWidget *treeview;
-	GtkWidget *add_feed;
-	GtkWidget *check1;
-	GtkWidget *check2;
-	GtkWidget *check3;
-	GtkWidget *spin;
-	GtkWidget *use_proxy;
-	GtkWidget *host_proxy;
-	GtkWidget *port_proxy;
-	GtkWidget *proxy_details;
-	GtkWidget *details;
-	GtkWidget *import;
-	GtkWidget *import_fs;
-	GtkWidget *export_fs;
-	GtkWidget *export;
-	GtkWidget *combo_hbox;
-} setupfeed;
-
 struct _send_data {
         GList *infos;
 
@@ -360,6 +341,7 @@ gboolean feed_is_new(gchar *file_name, gchar *needle);
 gboolean web_auth_dialog(gchar *url);
 gchar *get_main_folder(void);
 gpointer lookup_key(gpointer key);
+void rss_delete_feed(gchar *name, gboolean folder);
 
 #ifdef _WIN32
 char *strcasestr(const char *a, const char *b);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]