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 "ghtml.h"
#include "../config.h" #include "../config.h"
#define max(a, b) ((a) > (b) ? (a) : (b))
/* GHtml */ /* GHtml */
/* private */ /* private */
@ -415,6 +417,13 @@ static void _ghtmlconn_delete(GHtmlConn * ghtmlconn)
if(ghtmlconn->stream != NULL) if(ghtmlconn->stream != NULL)
html_stream_close(ghtmlconn->stream); html_stream_close(ghtmlconn->stream);
free(ghtmlconn); 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) 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) if(url == NULL)
return NULL; return NULL;
/* XXX use a more generic protocol finder (strchr(':')) */ /* XXX use a more generic protocol finder (strchr(':')) */
if(strncmp("ftp://", url, 6) == 0)
return g_strdup(url);
if(strncmp("http://", url, 7) == 0) if(strncmp("http://", url, 7) == 0)
return g_strdup(url); 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); return g_strdup(url);
if(base != NULL) if(base != NULL)
{ {
@ -739,6 +752,7 @@ static void _http_data_complete(GConnHttpEventData * event, GHtmlConn * conn)
{ {
gchar * buf; gchar * buf;
gsize size; gsize size;
GHtml * ghtml;
if(gnet_conn_http_steal_buffer(conn->http, &buf, &size) != TRUE) 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); html_stream_write(conn->stream, buf, size);
_http_data_progress(event, conn); _http_data_progress(event, conn);
} }
surfer_set_status(conn->ghtml->surfer, NULL); ghtml = conn->ghtml;
_ghtmlconn_delete(conn); _ghtmlconn_delete(conn);
if(ghtml->conns_cnt == 0)
surfer_set_status(ghtml->surfer, NULL);
} }
static void _http_data_partial(GConnHttpEventData * event, GHtmlConn * conn) 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; size_t i;
GHtmlConn * p; GHtmlConn * p;
guint64 len = 0; guint64 len = 1; /* don't divide by zero */
guint64 rec = 0; guint64 rec = 1;
gdouble fraction; gdouble fraction;
conn->data_received = event->data_received; 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 if((p = conn->ghtml->conns[i]) == NULL
|| p->content_length == 0) || p->content_length == 0)
continue; continue;
len += p->content_length; len += (p->content_length != 0) ? p->content_length
: p->data_received + 1;
rec += p->data_received; 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) static void _http_error(GConnHttpEventError * event, GHtmlConn * conn)

View File

@ -128,7 +128,6 @@ Surfer * surfer_new(char const * url)
GtkWidget * toolbar; GtkWidget * toolbar;
GtkToolItem * toolitem; GtkToolItem * toolitem;
GtkWidget * widget; GtkWidget * widget;
GtkWidget * hbox;
if((surfer = malloc(sizeof(*surfer))) == NULL) if((surfer = malloc(sizeof(*surfer))) == NULL)
return NULL; return NULL;
@ -217,19 +216,21 @@ Surfer * surfer_new(char const * url)
ghtml_load_url(surfer->view, url); ghtml_load_url(surfer->view, url);
gtk_box_pack_start(GTK_BOX(vbox), surfer->view, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), surfer->view, TRUE, TRUE, 0);
/* statusbar */ /* statusbar */
hbox = gtk_hbox_new(FALSE, 0); surfer->statusbox = gtk_hbox_new(FALSE, 0);
surfer->progress = gtk_progress_bar_new(); 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 = gtk_statusbar_new();
surfer->statusbar_id = gtk_statusbar_push(GTK_STATUSBAR( surfer->statusbar_id = 0;
surfer->statusbar), gtk_box_pack_start(GTK_BOX(surfer->statusbox), surfer->statusbar, TRUE,
gtk_statusbar_get_context_id(GTK_STATUSBAR( TRUE, 0);
surfer->statusbar), ""), "Ready"); gtk_widget_show_all(surfer->statusbox);
gtk_box_pack_start(GTK_BOX(hbox), surfer->statusbar, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(surfer->window), vbox); gtk_container_add(GTK_CONTAINER(surfer->window), vbox);
gtk_widget_grab_focus(GTK_WIDGET(surfer->tb_path)); gtk_widget_grab_focus(GTK_WIDGET(surfer->tb_path));
gtk_widget_show_all(surfer->window); 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++; surfer_cnt++;
return surfer; return surfer;
} }
@ -354,6 +355,20 @@ void surfer_set_status(Surfer * surfer, char const * status)
surfer->statusbar_id = gtk_statusbar_push(sb, surfer->statusbar_id = gtk_statusbar_push(sb,
gtk_statusbar_get_context_id(sb, ""), (status != NULL) gtk_statusbar_get_context_id(sb, ""), (status != NULL)
? status : "Ready"); ? 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 * tb_path;
GtkWidget * view; GtkWidget * view;
GtkWidget * progress; GtkWidget * progress;
GtkWidget * statusbox;
GtkWidget * statusbar; GtkWidget * statusbar;
guint statusbar_id; guint statusbar_id;
} Surfer; } Surfer;