diff --git a/config.def.h b/config.def.h index 1cba4d7..3065c73 100644 --- a/config.def.h +++ b/config.def.h @@ -11,6 +11,7 @@ static char *progress_proxy_untrust = "#FF6600"; static char *stylefile = "~/.surf/style.css"; static char *scriptfile = "~/.surf/script.js"; static char *cookiefile = "~/.surf/cookies.txt"; +static char *downdir = "/tmp"; static time_t sessiontime = 3600; static char *cafile = "/etc/ssl/certs/ca-certificates.crt"; static char *strictssl = FALSE; /* Refuse untrusted SSL connections */ diff --git a/surf.c b/surf.c index c9fa08d..4d589aa 100644 --- a/surf.c +++ b/surf.c @@ -114,6 +114,7 @@ static void destroyclient(Client *c); static void destroywin(GtkWidget* w, Client *c); static void die(const char *errstr, ...); static void drawindicator(Client *c); +static void download(WebKitDownload *o, GParamSpec *pspec, Client *c); static void eval(Client *c, const Arg *arg); static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c); static void find(Client *c, const Arg *arg); @@ -289,6 +290,50 @@ cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, flock(COOKIEJAR(self)->lock, LOCK_UN); } +struct client_size_tuple { + Client* c; + gint s; +}; + +static void +late_download_update(WebKitWebView* view, GParamSpec *pspec, struct client_size_tuple* t){ + char script[1024]; char* s= script; + snprintf(script, 1024, "c(%d, %d)", t->s, t->s); + const Arg a= {.v = (void*) &s}; + eval(t->c, &a); + free(t); +} + +static void +download(WebKitDownload *o, GParamSpec *pspec, Client *c) { + WebKitDownloadStatus status; + char script[2048]; char* s= script; + + status = webkit_download_get_status(o); + if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status == WEBKIT_DOWNLOAD_STATUS_CREATED) { + snprintf(script, 2048, "u(%d, %d, %d)", + (gint)webkit_download_get_current_size(o), + (gint)webkit_download_get_total_size(o), + (gint)(webkit_download_get_progress(o) * 100)); + const Arg a= {.v = (void*) &s}; + eval(c, &a); + } + else if (status == WEBKIT_DOWNLOAD_STATUS_FINISHED){ + if( webkit_web_view_get_load_status(c->view) == WEBKIT_LOAD_FINISHED ){ + snprintf(script, 2048, "c(%d, %d)", + (gint)webkit_download_get_current_size(o), + (gint)webkit_download_get_total_size(o)); + const Arg a= {.v = (void*) &s}; + eval(c, &a); + } + else { + struct client_size_tuple* t= calloc(1, sizeof(struct client_size_tuple)); + t->c= c; t->s= (gint)webkit_download_get_current_size(o); + g_signal_connect(c->view, "document-load-finished", G_CALLBACK(late_download_update), t); + } + } +} + static void evalscript(JSContextRef js, char *script, char* scriptname) { JSStringRef jsscript, jsscriptname; @@ -496,12 +541,105 @@ geturi(Client *c) { static gboolean initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) { - Arg arg; + gchar *uri, *path; + const gchar *filename; + Client *n; + const char template[] = +"" \ +"
" \ +"