]> spindle.queued.net Git - midori/commitdiff
Make the web view aware of news feeds
authorChristian Dywan <christian@twotoasts.de>
Mon, 21 Jul 2008 13:55:08 +0000 (15:55 +0200)
committerChristian Dywan <christian@twotoasts.de>
Mon, 21 Jul 2008 13:55:08 +0000 (15:55 +0200)
This introduces the logic needed to lookup news feeds
and implements a signal news-feed-ready in MidoriWebView,
similar to icon-ready.
The interface in the browser still needs to be done.

midori/midori-browser.c
midori/midori-locationentry.c
midori/midori-webview.c
midori/midori-webview.h

index 924d44269632377b37462da429c95e8a7e56ce77..a5dea097f09e4eec33aba1d6bd0c60dff90a1129 100644 (file)
@@ -285,6 +285,10 @@ _midori_browser_update_interface (MidoriBrowser* browser)
     katze_throbber_set_animated (KATZE_THROBBER (browser->throbber), loading);
     icon = katze_throbber_get_static_pixbuf (KATZE_THROBBER (
         g_object_get_data (G_OBJECT (widget), "browser-tab-icon")));
+    /* FIXME show news feed icon if feeds are available */
+    /* gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (
+            gtk_bin_get_child (GTK_BIN (browser->location))),
+            GTK_ICON_ENTRY_SECONDARY, NULL); */
 }
 
 static GtkWidget*
@@ -442,6 +446,25 @@ midori_web_view_element_motion_cb (MidoriWebView* web_View,
     _midori_browser_set_statusbar_text (browser, link_uri);
 }
 
+static void
+midori_web_view_load_committed_cb (GtkWidget*      web_view,
+                                   WebKitWebFrame* web_frame,
+                                   MidoriBrowser*  browser)
+{
+    const gchar* uri;
+
+    if (web_view == midori_browser_get_current_web_view (browser))
+    {
+        uri = midori_web_view_get_display_uri (MIDORI_WEB_VIEW (web_view));
+        midori_location_entry_set_text (MIDORI_LOCATION_ENTRY (
+                                        browser->location), uri);
+        _midori_browser_set_statusbar_text (browser, NULL);
+        gtk_icon_entry_set_icon_from_pixbuf (GTK_ICON_ENTRY (
+            gtk_bin_get_child (GTK_BIN (browser->location))),
+            GTK_ICON_ENTRY_SECONDARY, NULL);
+    }
+}
+
 static void
 midori_web_view_icon_ready_cb (MidoriWebView* web_view,
                                GdkPixbuf*     icon,
@@ -464,16 +487,15 @@ midori_web_view_icon_ready_cb (MidoriWebView* web_view,
 }
 
 static void
-midori_web_view_load_committed_cb (GtkWidget*      web_view,
-                                   WebKitWebFrame* web_frame,
-                                   MidoriBrowser*  browser)
+midori_web_view_news_feed_ready_cb (MidoriWebView* web_view,
+                                    const gchar*   href,
+                                    const gchar*   type,
+                                    const gchar*   title,
+                                    MidoriBrowser* browser)
 {
-    if (web_view == midori_browser_get_current_web_view (browser))
-    {
-        const gchar* uri = midori_web_view_get_display_uri (MIDORI_WEB_VIEW (web_view));
-        midori_location_entry_set_text (MIDORI_LOCATION_ENTRY (browser->location), uri);
-        _midori_browser_set_statusbar_text (browser, NULL);
-    }
+    gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (
+        gtk_bin_get_child (GTK_BIN (browser->location))),
+        GTK_ICON_ENTRY_SECONDARY, GTK_STOCK_INDEX);
 }
 
 static gboolean
@@ -919,6 +941,8 @@ _midori_browser_add_tab (MidoriBrowser* browser,
                           midori_web_view_load_committed_cb, browser,
                           "signal::icon-ready",
                           midori_web_view_icon_ready_cb, browser,
+                          "signal::news-feed-ready",
+                          midori_web_view_news_feed_ready_cb, browser,
                           "signal::progress-started",
                           midori_web_view_progress_started_cb, browser,
                           "signal::progress-changed",
@@ -3284,6 +3308,13 @@ midori_browser_init (MidoriBrowser* browser)
 
     /* Location */
     browser->location = midori_location_entry_new ();
+    /* FIXME: Due to a bug in GtkIconEntry we need to set an initial icon */
+    gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (
+        gtk_bin_get_child (GTK_BIN (browser->location))),
+        GTK_ICON_ENTRY_SECONDARY, GTK_STOCK_INDEX);
+    gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (
+        gtk_bin_get_child (GTK_BIN (browser->location))),
+        GTK_ICON_ENTRY_SECONDARY, TRUE);
     /* FIXME: sokoke_entry_setup_completion (GTK_ENTRY (browser->location)); */
     g_object_connect (browser->location,
                       "signal::active-changed",
index 3e9c8728f2af608808d69a9bca067e0c54bdee5a..37f2a448aa3fb4e150dce846fa8f3a7cfb89059d 100644 (file)
@@ -80,8 +80,6 @@ midori_location_entry_init (MidoriLocationEntry* location_entry)
 
     entry = gtk_icon_entry_new ();
     gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry), GTK_ICON_ENTRY_PRIMARY, DEFAULT_ICON);
-    gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry), GTK_ICON_ENTRY_SECONDARY, GTK_STOCK_CLEAR);
-    gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (entry), GTK_ICON_ENTRY_SECONDARY, TRUE);
     g_signal_connect (entry, "icon_released", G_CALLBACK (entry_icon_released), NULL);
     g_signal_connect (entry, "key-press-event", G_CALLBACK (entry_key_press_event), location_entry);
 
@@ -139,7 +137,7 @@ entry_icon_released (GtkIconEntry* entry,
                      gpointer      user_data)
 {
     if (icon_pos == GTK_ICON_ENTRY_SECONDARY)
-        gtk_entry_set_text (GTK_ENTRY (entry), "");
+        /* FIXME Show available news feeds */;
 }
 
 static void
index 792e66bbe8e210f97f02591445147ad4fb85ac56..9b95cdca6fda1096ee35cfa54e9ffef66c93c0a1 100644 (file)
@@ -12,6 +12,7 @@
 #include "midori-webview.h"
 
 #include "main.h"
+#include "gjs.h"
 #include "sokoke.h"
 #include "compat.h"
 
@@ -59,6 +60,7 @@ enum
 
 enum {
     ICON_READY,
+    NEWS_FEED_READY,
     PROGRESS_STARTED,
     PROGRESS_CHANGED,
     PROGRESS_DONE,
@@ -87,6 +89,44 @@ midori_web_view_get_property (GObject*    object,
                               GValue*     value,
                               GParamSpec* pspec);
 
+static void
+midori_cclosure_marshal_VOID__STRING_STRING_STRING (GClosure*     closure,
+                                                    GValue*       return_value,
+                                                    guint         n_param_values,
+                                                    const GValue* param_values,
+                                                    gpointer      invocation_hint,
+                                                    gpointer      marshal_data)
+{
+    typedef void(*GMarshalFunc_VOID__STRING_STRING_STRING) (gpointer      data1,
+                                                            const gchar*  arg_1,
+                                                            const gchar*  arg_2,
+                                                            const gchar*  arg_3,
+                                                            gpointer      data2);
+    register GMarshalFunc_VOID__STRING_STRING_STRING callback;
+    register GCClosure* cc = (GCClosure*) closure;
+    register gpointer data1, data2;
+
+    g_return_if_fail (n_param_values == 4);
+
+    if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+        data1 = closure->data;
+        data2 = g_value_peek_pointer (param_values + 0);
+    }
+    else
+    {
+        data1 = g_value_peek_pointer (param_values + 0);
+        data2 = closure->data;
+    }
+    callback = (GMarshalFunc_VOID__STRING_STRING_STRING) (marshal_data
+        ? marshal_data : cc->callback);
+    callback (data1,
+              g_value_get_string (param_values + 1),
+              g_value_get_string (param_values + 2),
+              g_value_get_string (param_values + 3),
+              data2);
+}
+
 static void
 midori_web_view_class_init (MidoriWebViewClass* class)
 {
@@ -101,6 +141,19 @@ midori_web_view_class_init (MidoriWebViewClass* class)
         G_TYPE_NONE, 1,
         GDK_TYPE_PIXBUF);
 
+    signals[NEWS_FEED_READY] = g_signal_new (
+        "news-feed-ready",
+        G_TYPE_FROM_CLASS (class),
+        (GSignalFlags)(G_SIGNAL_RUN_LAST),
+        G_STRUCT_OFFSET (MidoriWebViewClass, news_feed_ready),
+        0,
+        NULL,
+        midori_cclosure_marshal_VOID__STRING_STRING_STRING,
+        G_TYPE_NONE, 3,
+        G_TYPE_STRING,
+        G_TYPE_STRING,
+        G_TYPE_STRING);
+
     signals[PROGRESS_STARTED] = g_signal_new (
         "progress-started",
         G_TYPE_FROM_CLASS (class),
@@ -423,11 +476,43 @@ webkit_web_view_load_finished (MidoriWebView* web_view)
     g_signal_emit (web_view, signals[PROGRESS_DONE], 0, web_view->progress);
 }
 
+static void
+gjs_value_links_foreach_cb (GjsValue*      link,
+                            MidoriWebView* web_view)
+{
+    const gchar* type;
+
+    if (gjs_value_is_object (link) && gjs_value_has_attribute (link, "type")
+        && gjs_value_has_attribute (link, "href"))
+    {
+        type = gjs_value_get_attribute_string (link, "type");
+        if (!strcmp (type, "application/rss+xml")
+            || !strcmp (type, "application/x.atom+xml")
+            || !strcmp (type, "application/atom+xml"))
+            g_signal_emit (web_view, signals[NEWS_FEED_READY], 0,
+                gjs_value_get_attribute_string (link, "href"), type,
+                gjs_value_has_attribute (link, "title")
+                ? gjs_value_get_attribute_string (link, "title") : NULL);
+    }
+}
+
 static void
 webkit_web_frame_load_done (WebKitWebFrame* web_frame,
                             gboolean        success,
                             MidoriWebView*  web_view)
 {
+    GjsValue* value;
+    GjsValue* document;
+    GjsValue* links;
+
+    value = gjs_value_new (webkit_web_frame_get_global_context (web_frame), NULL);
+    document = gjs_value_get_by_name (value, "document");
+    links = gjs_value_get_elements_by_tag_name (document, "link");
+    gjs_value_foreach (links, (GjsCallback)gjs_value_links_foreach_cb, web_view);
+    g_object_unref (links);
+    g_object_unref (document);
+    g_object_unref (value);
+
     web_view->is_loading = FALSE;
     web_view->progress = -1;
 
index 4cf8838b77adab7c033f4b94cc01392dd1fa91e6..adab180e42804da32fe907d316e0aee8f6ee3a4a 100644 (file)
@@ -44,6 +44,11 @@ struct _MidoriWebViewClass
     (*icon_ready)             (MidoriWebView*        web_view,
                                GdkPixbuf*            icon);
     void
+    (*news_feed_ready)        (MidoriWebView*        web_view,
+                               const gchar*          href,
+                               const gchar*          type,
+                               const gchar*          title);
+    void
     (*progress_started)       (MidoriWebView*        web_view,
                                guint                 progress);
     void