diff --git a/src/ghtml-webkit.c b/src/ghtml-webkit.c
index 4e91438..7ebfc78 100644
--- a/src/ghtml-webkit.c
+++ b/src/ghtml-webkit.c
@@ -25,7 +25,11 @@
/* callbacks */
static void _on_hovering_over_link(WebKitWebView * view, const gchar * title,
const gchar * url, gpointer data);
-static void _on_progress_changed(WebKitWebView * view, gint progress,
+static void _on_load_finished(WebKitWebView * view, WebKitWebFrame * frame,
+ gpointer data);
+static void _on_load_progress_changed(WebKitWebView * view, gint progress,
+ gpointer data);
+static void _on_load_started(WebKitWebView * view, WebKitWebFrame * frame,
gpointer data);
static void _on_title_changed(WebKitWebView * view, WebKitWebFrame * frame,
const gchar * title, gpointer data);
@@ -42,16 +46,20 @@ GtkWidget * ghtml_new(Surfer * surfer)
/* widgets */
view = webkit_web_view_new();
widget = gtk_scrolled_window_new(NULL, NULL);
+ g_object_set_data(G_OBJECT(widget), "surfer", surfer);
+ g_object_set_data(G_OBJECT(widget), "view", view);
/* view */
g_signal_connect(G_OBJECT(view), "hovering-over-link", G_CALLBACK(
_on_hovering_over_link), widget);
+ g_signal_connect(G_OBJECT(view), "load-finished", G_CALLBACK(
+ _on_load_finished), widget);
g_signal_connect(G_OBJECT(view), "load-progress-changed", G_CALLBACK(
- _on_progress_changed), widget);
+ _on_load_progress_changed), widget);
+ g_signal_connect(G_OBJECT(view), "load-started", G_CALLBACK(
+ _on_load_started), widget);
g_signal_connect(G_OBJECT(view), "title-changed", G_CALLBACK(
_on_title_changed), widget);
/* scrolled window */
- g_object_set_data(G_OBJECT(widget), "surfer", surfer);
- g_object_set_data(G_OBJECT(widget), "view", view);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(widget), view);
@@ -219,7 +227,18 @@ static void _on_hovering_over_link(WebKitWebView * view, const gchar * title,
}
-static void _on_progress_changed(WebKitWebView * view, gint progress,
+static void _on_load_finished(WebKitWebView * view, WebKitWebFrame * arg1,
+ gpointer data)
+{
+ Surfer * surfer;
+
+ surfer = g_object_get_data(G_OBJECT(data), "surfer");
+ surfer_set_progress(surfer, -1.0);
+ surfer_set_status(surfer, NULL);
+}
+
+
+static void _on_load_progress_changed(WebKitWebView * view, gint progress,
gpointer data)
{
Surfer * surfer;
@@ -230,6 +249,17 @@ static void _on_progress_changed(WebKitWebView * view, gint progress,
}
+static void _on_load_started(WebKitWebView * view, WebKitWebFrame * frame,
+ gpointer data)
+{
+ Surfer * surfer;
+
+ surfer = g_object_get_data(G_OBJECT(data), "surfer");
+ surfer_set_progress(surfer, 0.0);
+ surfer_set_status(surfer, "Downloading...");
+}
+
+
static void _on_title_changed(WebKitWebView * view, WebKitWebFrame * frame,
const gchar * title, gpointer data)
{
diff --git a/src/surfer.c b/src/surfer.c
index d36d333..c54d401 100644
--- a/src/surfer.c
+++ b/src/surfer.c
@@ -120,6 +120,7 @@ unsigned int surfer_cnt = 0;
#ifndef FOR_EMBEDDED
static GtkWidget * _new_menubar(Surfer * surfer);
#endif
+static gboolean _new_idle(gpointer data);
Surfer * surfer_new(char const * url)
{
@@ -212,8 +213,6 @@ Surfer * surfer_new(char const * url)
surfer_delete(surfer);
return NULL;
}
- if(url != NULL)
- ghtml_load_url(surfer->view, url);
gtk_box_pack_start(GTK_BOX(vbox), surfer->view, TRUE, TRUE, 0);
/* statusbar */
surfer->statusbox = gtk_hbox_new(FALSE, 0);
@@ -232,6 +231,13 @@ Surfer * surfer_new(char const * url)
gtk_box_pack_start(GTK_BOX(vbox), surfer->statusbox, FALSE, FALSE, 0);
surfer_set_status(surfer, NULL);
surfer_cnt++;
+ /* load url as soon as we're idle */
+ if(url != NULL)
+ {
+ g_object_set_data(G_OBJECT(surfer->window), "url",
+ g_strdup(url)); /* XXX a bit ugly */
+ g_idle_add(_new_idle, surfer);
+ }
return surfer;
}
@@ -297,6 +303,17 @@ static GtkWidget * _new_menubar(Surfer * surfer)
}
#endif /* !FOR_EMBEDDED */
+static gboolean _new_idle(gpointer data)
+{
+ Surfer * surfer = data;
+ gchar * url;
+
+ url = g_object_get_data(G_OBJECT(surfer->window), "url");
+ ghtml_load_url(surfer->view, url);
+ g_free(url);
+ return FALSE;
+}
+
/* surfer_delete */
void surfer_delete(Surfer * surfer)