diff options
Diffstat (limited to 'lib/src/gecko-browser.cpp')
-rw-r--r-- | lib/src/gecko-browser.cpp | 85 |
1 files changed, 81 insertions, 4 deletions
diff --git a/lib/src/gecko-browser.cpp b/lib/src/gecko-browser.cpp index cab07f8..bce6c40 100644 --- a/lib/src/gecko-browser.cpp +++ b/lib/src/gecko-browser.cpp @@ -22,6 +22,11 @@ #include <nsIPrefService.h> #include <nsServiceManagerUtils.h> +enum { + PROP_0, + PROP_PROGRESS +}; + void gecko_browser_startup(void) { @@ -48,8 +53,38 @@ gecko_browser_new(void) } static void +gecko_browser_get_property(GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GeckoBrowser *browser = GECKO_BROWSER(object); + + switch (prop_id) { + case PROP_PROGRESS: + g_value_set_double(value, browser->progress); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static void gecko_browser_class_init(GeckoBrowserClass *browser_class) { + GObjectClass *gobject_class = G_OBJECT_CLASS(browser_class); + + gobject_class->get_property = gecko_browser_get_property; + + g_object_class_install_property (gobject_class, PROP_PROGRESS, + g_param_spec_double ("progress", + "Progress", + "Progress", + 0.0, 1.0, 0.0, + G_PARAM_READABLE)); } GeckoBrowser * @@ -59,9 +94,9 @@ gecko_browser_create_window(GeckoBrowser *browser) } static void -gecko_browser_new_window_cb(GtkMozEmbed *embed, - GtkMozEmbed **newEmbed, - guint chromemask) +new_window_cb(GtkMozEmbed *embed, + GtkMozEmbed **newEmbed, + guint chromemask) { GeckoBrowser *browser; @@ -71,8 +106,50 @@ gecko_browser_new_window_cb(GtkMozEmbed *embed, } static void +gecko_browser_set_progress(GeckoBrowser *browser, float progress) +{ + g_return_if_fail(GECKO_IS_BROWSER(browser)); + + browser->progress = progress; + g_object_notify (G_OBJECT(browser), "progress"); +} + +static void +net_state_cb(GtkMozEmbed *embed, const char *aURI, gint state, guint status) +{ + GeckoBrowser *browser = GECKO_BROWSER(embed); + + if (state & GTK_MOZ_EMBED_FLAG_IS_NETWORK) { + if (state & GTK_MOZ_EMBED_FLAG_START) { + browser->total_requests = 0; + browser->current_requests = 0; + } + } + + if (state & GTK_MOZ_EMBED_FLAG_IS_REQUEST) { + float progress; + + if (state & GTK_MOZ_EMBED_FLAG_START) { + browser->total_requests++; + } + else if (state & GTK_MOZ_EMBED_FLAG_STOP) + { + browser->current_requests++; + } + + progress = float(browser->current_requests) / + float(browser->total_requests); + gecko_browser_set_progress(browser, progress); + } +} + +static void gecko_browser_init(GeckoBrowser *browser) { + browser->progress = 0.0; + g_signal_connect(G_OBJECT(browser), "new-window", - G_CALLBACK(gecko_browser_new_window_cb), NULL); + G_CALLBACK(new_window_cb), NULL); + g_signal_connect(G_OBJECT(browser), "net-state-all", + G_CALLBACK(net_state_cb), NULL); } |