[epiphany-extensions] rss: don't show Subscribe to this feed in every link
- From: Diego Escalante Urrelo <diegoe src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [epiphany-extensions] rss: don't show Subscribe to this feed in every link
- Date: Fri, 22 Jan 2010 21:38:24 +0000 (UTC)
commit c48946dff9cbd2c0f2e79e3c781d4cc3b07774a5
Author: Diego Escalante Urrelo <descalante igalia com>
Date: Fri Jan 22 15:49:43 2010 -0500
rss: don't show Subscribe to this feed in every link
Bug #606910
extensions/rss/ephy-rss-extension.c | 101 +++++++++++++++++++++--------------
extensions/rss/rss-feedlist.c | 2 +-
2 files changed, 61 insertions(+), 42 deletions(-)
---
diff --git a/extensions/rss/ephy-rss-extension.c b/extensions/rss/ephy-rss-extension.c
index 17f2ac9..7e23db3 100644
--- a/extensions/rss/ephy-rss-extension.c
+++ b/extensions/rss/ephy-rss-extension.c
@@ -1,5 +1,6 @@
/*
* Copyright © 2005 Raphaël Slinckx <raphael slinckx net>
+ * Copyright © 2010 Igalia S.L.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -114,66 +115,84 @@ static void
ephy_rss_feed_subscribe_cb (GtkAction *action,
EphyWindow *window)
{
- GValue value = { 0, };
GError *error = NULL;
- EphyEmbedEvent *event;
- gboolean success;
- EphyRssExtension *extension = EPHY_RSS_EXTENSION (g_object_get_data (
- G_OBJECT (window),
- EPHY_RSS_EXTENSION_DATA_KEY));
+ gboolean success = FALSE;
+ EphyRssExtension *extension;
+ EphyEmbed *embed;
+ WebKitWebView *view;
+ GdkEventButton *event;
+ WebKitHitTestResult *hit_test;
+ char *uri;
LOG ("Subscribing to the feed");
- event = ephy_window_get_context_event (window);
- if (event == NULL) return;
+ extension = EPHY_RSS_EXTENSION (g_object_get_data (G_OBJECT (window), EPHY_RSS_EXTENSION_DATA_KEY));
+
+ embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
+ view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
+
+ event = (GdkEventButton *) (g_object_get_data (G_OBJECT (window),
+ "rss-event"));
+
+ hit_test = webkit_web_view_get_hit_test_result (view, event);
+ gdk_event_free ((GdkEvent *) event);
- ephy_embed_event_get_property (event, "link", &value);
+ g_object_get (hit_test, "link-uri", &uri, NULL);
+ g_object_unref (hit_test);
- if (!dbus_g_proxy_call (extension->priv->proxy, RSS_DBUS_SUBSCRIBE, &error,
- G_TYPE_STRING, g_value_get_string (&value),
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &success,
- G_TYPE_INVALID))
+ dbus_g_proxy_call (extension->priv->proxy,
+ RSS_DBUS_SUBSCRIBE, &error,
+ G_TYPE_STRING, uri,
+ G_TYPE_INVALID,
+ G_TYPE_BOOLEAN, &success,
+ G_TYPE_INVALID);
+
+ if (!success)
{
LOG ("Error while retreiving method answer: %s", error->message);
g_error_free (error);
}
- g_object_set(action, "sensitive", FALSE, "visible", FALSE, NULL);
- g_value_unset (&value);
+ g_object_set (action, "sensitive", FALSE, "visible", FALSE, NULL);
}
static gboolean
-ephy_rss_ge_context_cb (EphyWebView *view,
- EphyEmbedEvent *event,
- EphyWindow *window)
+ephy_rss_button_press_cb (EphyWebView *view,
+ GdkEventButton *event,
+ EphyWindow *window)
{
WindowData *data;
- GValue value = { 0, };
- const char *address;
FeedList *list;
+ WebKitHitTestResult *hit_test;
+ guint context;
+ char *uri;
gboolean active = FALSE;
+ if (event->button != 3 || event->type != GDK_BUTTON_PRESS)
+ return FALSE;
+
list = g_object_get_data (G_OBJECT (view), FEEDLIST_DATA_KEY);
+ data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY);
+ g_return_val_if_fail (data != NULL, FALSE);
- if ((ephy_embed_event_get_context (event) & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) && (list != NULL))
- {
- LOG ("Context menu on a link");
- data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY);
- g_return_val_if_fail (data != NULL, FALSE);
+ hit_test = webkit_web_view_get_hit_test_result (WEBKIT_WEB_VIEW (view), event);
+ g_object_get (hit_test, "context", &context, NULL);
- ephy_embed_event_get_property (event, "link", &value);
- address = g_value_get_string (&value);
+ if ((context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) && (list != NULL))
+ {
+ g_object_get (hit_test, "link-uri", &uri, NULL);
+ active = rss_feedlist_contains (list, uri);
+ g_free (uri);
- active = rss_feedlist_contains (list, address);
+ g_object_set_data (G_OBJECT (window), "rss-event",
+ gdk_event_copy ((GdkEvent *) event));
- LOG ("Showing menu item: %d", active);
g_object_set (data->subscribe_action,
"sensitive", active,
"visible", active,
NULL);
- g_value_unset (&value);
}
+ g_object_unref (hit_test);
return FALSE;
}
@@ -307,11 +326,9 @@ impl_attach_tab (EphyExtension *extension,
g_signal_connect_after (view, "new-document-now",
G_CALLBACK (ephy_rss_ge_content_cb), window);
g_signal_connect_after (view, "ge-feed-link",
- G_CALLBACK (ephy_rss_ge_feed_cb), window);
- /*
- g_signal_connect (view, "ge-context-menu",
- G_CALLBACK (ephy_rss_ge_context_cb), window);
- */
+ G_CALLBACK (ephy_rss_ge_feed_cb), window);
+ g_signal_connect (view, "button-press-event",
+ G_CALLBACK (ephy_rss_button_press_cb), window);
}
/* Stop listening for the detached tab rss feeds */
@@ -320,21 +337,23 @@ impl_detach_tab (EphyExtension *extension,
EphyWindow *window,
EphyEmbed *embed)
{
+ EphyWebView *view;
+
LOG ("Detach tab rss listener");
g_return_if_fail (EPHY_IS_EMBED (embed));
+ view = ephy_embed_get_web_view (embed);
+
/* We don't want any new rss notif for this tab */
g_signal_handlers_disconnect_by_func
- (embed, G_CALLBACK (ephy_rss_ge_feed_cb), window);
+ (view, G_CALLBACK (ephy_rss_ge_feed_cb), window);
g_signal_handlers_disconnect_by_func
- (embed, G_CALLBACK (ephy_rss_ge_content_cb), window);
+ (view, G_CALLBACK (ephy_rss_ge_content_cb), window);
- /*
g_signal_handlers_disconnect_by_func
- (embed, G_CALLBACK (ephy_rss_ge_context_cb), window);
- */
+ (view, G_CALLBACK (ephy_rss_button_press_cb), window);
/* destroy data */
g_object_set_data (G_OBJECT (embed), FEEDLIST_DATA_KEY, NULL);
diff --git a/extensions/rss/rss-feedlist.c b/extensions/rss/rss-feedlist.c
index 45370f4..3a66436 100644
--- a/extensions/rss/rss-feedlist.c
+++ b/extensions/rss/rss-feedlist.c
@@ -157,7 +157,7 @@ rss_feedlist_compare_feeds (gconstpointer a, gconstpointer b)
gboolean
rss_feedlist_contains (FeedList *feedlist,
- const char *address)
+ const char *address)
{
return g_slist_find_custom ((GSList *) feedlist, address, (GCompareFunc) rss_feedlist_compare_feeds) != NULL;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]