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*
_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,
}
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
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",
/* 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",
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);
gpointer user_data)
{
if (icon_pos == GTK_ICON_ENTRY_SECONDARY)
- gtk_entry_set_text (GTK_ENTRY (entry), "");
+ /* FIXME Show available news feeds */;
}
static void
#include "midori-webview.h"
#include "main.h"
+#include "gjs.h"
#include "sokoke.h"
#include "compat.h"
enum {
ICON_READY,
+ NEWS_FEED_READY,
PROGRESS_STARTED,
PROGRESS_CHANGED,
PROGRESS_DONE,
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)
{
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),
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;
(*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