Hiding the statusbar in embedded mode if appropriate (may break links at bottom of pages)

This commit is contained in:
Pierre Pronchery 2009-03-28 01:24:03 +00:00
parent 025e434d16
commit 032ddfd7c2
3 changed files with 49 additions and 19 deletions

View File

@ -40,6 +40,8 @@
#include "ghtml.h"
#include "../config.h"
#define max(a, b) ((a) > (b) ? (a) : (b))
/* GHtml */
/* private */
@ -415,6 +417,13 @@ static void _ghtmlconn_delete(GHtmlConn * ghtmlconn)
if(ghtmlconn->stream != NULL)
html_stream_close(ghtmlconn->stream);
free(ghtmlconn);
/* free the connections array if possible */
for(i = 0; i < ghtml->conns_cnt; i++)
if(ghtml->conns[i] != NULL)
return;
free(ghtml->conns);
ghtml->conns = NULL;
ghtml->conns_cnt = 0;
}
static void _ghtmlconn_delete_file(GHtmlConn * ghtmlconn)
@ -471,9 +480,13 @@ static gchar * _ghtml_make_url(gchar const * base, gchar const * url)
if(url == NULL)
return NULL;
/* XXX use a more generic protocol finder (strchr(':')) */
if(strncmp("ftp://", url, 6) == 0)
return g_strdup(url);
if(strncmp("http://", url, 7) == 0)
return g_strdup(url);
if(strncmp("ftp://", url, 6) == 0)
if(strncmp("https://", url, 8) == 0)
return g_strdup(url);
if(strncmp("mailto:", url, 7) == 0)
return g_strdup(url);
if(base != NULL)
{
@ -739,6 +752,7 @@ static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn)
{
gchar * buf;
gsize size;
GHtml * ghtml;
if(gnet_conn_http_steal_buffer(conn->http, &buf, &size) != TRUE)
{
@ -751,8 +765,10 @@ static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn)
html_stream_write(conn->stream, buf, size);
_http_data_progress(event, conn);
}
surfer_set_status(conn->ghtml->surfer, NULL);
ghtml = conn->ghtml;
_ghtmlconn_delete(conn);
if(ghtml->conns_cnt == 0)
surfer_set_status(ghtml->surfer, NULL);
}
static void _http_data_partial(GConnHttpEventData * event, GHtmlConn * conn)
@ -775,8 +791,8 @@ static void _http_data_progress(GConnHttpEventData * event, GHtmlConn * conn)
{
size_t i;
GHtmlConn * p;
guint64 len = 0;
guint64 rec = 0;
guint64 len = 1; /* don't divide by zero */
guint64 rec = 1;
gdouble fraction;
conn->data_received = event->data_received;
@ -786,14 +802,12 @@ static void _http_data_progress(GConnHttpEventData * event, GHtmlConn * conn)
if((p = conn->ghtml->conns[i]) == NULL
|| p->content_length == 0)
continue;
len += p->content_length;
len += (p->content_length != 0) ? p->content_length
: p->data_received + 1;
rec += p->data_received;
}
if(len > 0)
{
fraction = rec;
surfer_set_progress(conn->ghtml->surfer, fraction / len);
}
fraction = rec;
surfer_set_progress(conn->ghtml->surfer, fraction / len);
}
static void _http_error(GConnHttpEventError * event, GHtmlConn * conn)

View File

@ -128,7 +128,6 @@ Surfer * surfer_new(char const * url)
GtkWidget * toolbar;
GtkToolItem * toolitem;
GtkWidget * widget;
GtkWidget * hbox;
if((surfer = malloc(sizeof(*surfer))) == NULL)
return NULL;
@ -217,19 +216,21 @@ Surfer * surfer_new(char const * url)
ghtml_load_url(surfer->view, url);
gtk_box_pack_start(GTK_BOX(vbox), surfer->view, TRUE, TRUE, 0);
/* statusbar */
hbox = gtk_hbox_new(FALSE, 0);
surfer->statusbox = gtk_hbox_new(FALSE, 0);
surfer->progress = gtk_progress_bar_new();
gtk_box_pack_start(GTK_BOX(hbox), surfer->progress, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(surfer->statusbox), surfer->progress, FALSE,
FALSE, 0);
surfer->statusbar = gtk_statusbar_new();
surfer->statusbar_id = gtk_statusbar_push(GTK_STATUSBAR(
surfer->statusbar),
gtk_statusbar_get_context_id(GTK_STATUSBAR(
surfer->statusbar), ""), "Ready");
gtk_box_pack_start(GTK_BOX(hbox), surfer->statusbar, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
surfer->statusbar_id = 0;
gtk_box_pack_start(GTK_BOX(surfer->statusbox), surfer->statusbar, TRUE,
TRUE, 0);
gtk_widget_show_all(surfer->statusbox);
gtk_container_add(GTK_CONTAINER(surfer->window), vbox);
gtk_widget_grab_focus(GTK_WIDGET(surfer->tb_path));
gtk_widget_show_all(surfer->window);
/* hack to display the statusbar only if necessary */
gtk_box_pack_start(GTK_BOX(vbox), surfer->statusbox, FALSE, FALSE, 0);
surfer_set_status(surfer, NULL);
surfer_cnt++;
return surfer;
}
@ -354,6 +355,20 @@ void surfer_set_status(Surfer * surfer, char const * status)
surfer->statusbar_id = gtk_statusbar_push(sb,
gtk_statusbar_get_context_id(sb, ""), (status != NULL)
? status : "Ready");
if(status == NULL)
{
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(surfer->progress),
"");
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
surfer->progress), 0.0);
#ifdef FOR_EMBEDDED
gtk_widget_hide(surfer->statusbox);
}
else
{
gtk_widget_show(surfer->statusbox);
#endif
}
}

View File

@ -54,6 +54,7 @@ typedef struct _Surfer
GtkWidget * tb_path;
GtkWidget * view;
GtkWidget * progress;
GtkWidget * statusbox;
GtkWidget * statusbar;
guint statusbar_id;
} Surfer;