Implemented status tracking with WebKit (with a few issues remaining)

This commit is contained in:
Pierre Pronchery 2010-04-21 11:31:58 +00:00
parent 41dbc91738
commit 38af1c106c

View File

@ -17,6 +17,8 @@
#include <stdlib.h>
#include <string.h>
#include <libintl.h> #include <libintl.h>
#include <webkit/webkit.h> #include <webkit/webkit.h>
#include "ghtml.h" #include "ghtml.h"
@ -27,6 +29,8 @@
/* private */ /* private */
/* prototypes */ /* prototypes */
/* functions */ /* functions */
static void _ghtml_set_status(GtkWidget * ghtml, char const * status);
/* callbacks */ /* callbacks */
static gboolean _on_console_message(WebKitWebView * view, const gchar * message, static gboolean _on_console_message(WebKitWebView * view, const gchar * message,
guint line, const gchar * source, gpointer data); guint line, const gchar * source, gpointer data);
@ -113,7 +117,7 @@ GtkWidget * ghtml_new(Surfer * surfer)
/* ghtml_delete */ /* ghtml_delete */
void ghtml_delete(GtkWidget * ghtml) void ghtml_delete(GtkWidget * ghtml)
{ {
/* FIXME is it necessary to destroy any widget? */ free(g_object_get_data(G_OBJECT(ghtml), "status"));
} }
@ -190,8 +194,7 @@ char const * ghtml_get_source(GtkWidget * ghtml)
/* ghtml_get_status */ /* ghtml_get_status */
char const * ghtml_get_status(GtkWidget * widget) char const * ghtml_get_status(GtkWidget * widget)
{ {
/* FIXME really implement */ return g_object_get_data(G_OBJECT(widget), "status");
return NULL;
} }
@ -263,6 +266,7 @@ gboolean ghtml_go_forward(GtkWidget * ghtml)
void ghtml_load_url(GtkWidget * ghtml, char const * url) void ghtml_load_url(GtkWidget * ghtml, char const * url)
{ {
GtkWidget * view; GtkWidget * view;
Surfer * surfer;
gchar * p; gchar * p;
if((p = _ghtml_make_url(NULL, url)) != NULL) if((p = _ghtml_make_url(NULL, url)) != NULL)
@ -270,6 +274,9 @@ void ghtml_load_url(GtkWidget * ghtml, char const * url)
view = g_object_get_data(G_OBJECT(ghtml), "view"); view = g_object_get_data(G_OBJECT(ghtml), "view");
webkit_web_view_open(WEBKIT_WEB_VIEW(view), url); webkit_web_view_open(WEBKIT_WEB_VIEW(view), url);
g_free(p); g_free(p);
surfer = g_object_get_data(G_OBJECT(ghtml), "surfer");
surfer_set_progress(surfer, 0.0);
_ghtml_set_status(ghtml, _("Connecting..."));
} }
@ -360,6 +367,28 @@ void ghtml_zoom_reset(GtkWidget * ghtml)
/* private */ /* private */
/* functions */ /* functions */
static void _ghtml_set_status(GtkWidget * ghtml, char const * status)
{
Surfer * surfer;
gdouble progress;
char * p;
surfer = g_object_get_data(G_OBJECT(ghtml), "surfer");
free(g_object_get_data(G_OBJECT(ghtml), "status"));
if(status == NULL)
{
if((progress = ghtml_get_progress(ghtml)) == 0.0)
status = _("Connecting...");
else if(progress > 0.0)
status = _("Downloading...");
}
g_object_set_data(G_OBJECT(ghtml), "status", (status != NULL)
? strdup(status) : NULL); /* XXX may fail */
surfer_set_status(surfer, status);
}
/* callbacks */
/* on_console_message */ /* on_console_message */
static gboolean _on_console_message(WebKitWebView * view, const gchar * message, static gboolean _on_console_message(WebKitWebView * view, const gchar * message,
guint line, const gchar * source, gpointer data) guint line, const gchar * source, gpointer data)
@ -411,10 +440,9 @@ static gboolean _on_download_requested(WebKitWebView * view,
static void _on_hovering_over_link(WebKitWebView * view, const gchar * title, static void _on_hovering_over_link(WebKitWebView * view, const gchar * title,
const gchar * url, gpointer data) const gchar * url, gpointer data)
{ {
Surfer * surfer; GtkWidget * ghtml = data;
surfer = g_object_get_data(G_OBJECT(data), "surfer"); _ghtml_set_status(ghtml, url);
surfer_set_status(surfer, url);
} }
@ -462,11 +490,12 @@ static gboolean _on_load_error(WebKitWebView * view, WebKitWebFrame * frame,
static void _on_load_finished(WebKitWebView * view, WebKitWebFrame * arg1, static void _on_load_finished(WebKitWebView * view, WebKitWebFrame * arg1,
gpointer data) gpointer data)
{ {
GtkWidget * ghtml = data;
Surfer * surfer; Surfer * surfer;
surfer = g_object_get_data(G_OBJECT(data), "surfer"); surfer = g_object_get_data(G_OBJECT(ghtml), "surfer");
surfer_set_progress(surfer, -1.0); surfer_set_progress(surfer, -1.0);
surfer_set_status(surfer, NULL); _ghtml_set_status(ghtml, NULL);
} }
@ -474,11 +503,13 @@ static void _on_load_finished(WebKitWebView * view, WebKitWebFrame * arg1,
static void _on_load_progress_changed(WebKitWebView * view, gint progress, static void _on_load_progress_changed(WebKitWebView * view, gint progress,
gpointer data) gpointer data)
{ {
GtkWidget * ghtml = data;
Surfer * surfer; Surfer * surfer;
gdouble fraction = progress; gdouble fraction = progress;
surfer = g_object_get_data(G_OBJECT(data), "surfer"); surfer = g_object_get_data(G_OBJECT(ghtml), "surfer");
surfer_set_progress(surfer, fraction / 100); surfer_set_progress(surfer, fraction / 100);
_ghtml_set_status(ghtml, _("Downloading..."));
} }
@ -486,11 +517,12 @@ static void _on_load_progress_changed(WebKitWebView * view, gint progress,
static void _on_load_started(WebKitWebView * view, WebKitWebFrame * frame, static void _on_load_started(WebKitWebView * view, WebKitWebFrame * frame,
gpointer data) gpointer data)
{ {
GtkWidget * ghtml = data;
Surfer * surfer; Surfer * surfer;
surfer = g_object_get_data(G_OBJECT(data), "surfer"); surfer = g_object_get_data(G_OBJECT(ghtml), "surfer");
surfer_set_progress(surfer, 0.0); surfer_set_progress(surfer, 0.00);
surfer_set_status(surfer, _("Downloading...")); _ghtml_set_status(ghtml, _("Downloading..."));
} }
@ -534,10 +566,11 @@ static gboolean _on_script_prompt(WebKitWebView * view, WebKitWebFrame * frame,
static void _on_status_bar_text_changed(WebKitWebView * view, gchar * arg1, static void _on_status_bar_text_changed(WebKitWebView * view, gchar * arg1,
gpointer data) gpointer data)
{ {
Surfer * surfer; GtkWidget * ghtml = data;
surfer = g_object_get_data(G_OBJECT(data), "surfer"); if(strlen(arg1) == 0)
surfer_set_status(surfer, arg1); return;
_ghtml_set_status(ghtml, arg1);
} }