[evolution-rss] correctly parse atom description construct (deb bug #528827)
- From: Lucian Langa <lucilanga src gnome org>
- To: svn-commits-list gnome org
- Subject: [evolution-rss] correctly parse atom description construct (deb bug #528827)
- Date: Tue, 26 May 2009 10:33:19 -0400 (EDT)
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]