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)