From: Christian Dywan Date: Mon, 21 Jul 2008 13:55:08 +0000 (+0200) Subject: Make the web view aware of news feeds X-Git-Url: https://spindle.queued.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=15f4ab98d47f5a573c1e46bcd3119f7b55ef509a;p=midori Make the web view aware of news feeds 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. --- diff --git a/midori/midori-browser.c b/midori/midori-browser.c index 924d4426..a5dea097 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -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", diff --git a/midori/midori-locationentry.c b/midori/midori-locationentry.c index 3e9c8728..37f2a448 100644 --- a/midori/midori-locationentry.c +++ b/midori/midori-locationentry.c @@ -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 diff --git a/midori/midori-webview.c b/midori/midori-webview.c index 792e66bb..9b95cdca 100644 --- a/midori/midori-webview.c +++ b/midori/midori-webview.c @@ -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; diff --git a/midori/midori-webview.h b/midori/midori-webview.h index 4cf8838b..adab180e 100644 --- a/midori/midori-webview.h +++ b/midori/midori-webview.h @@ -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