| fixing downloads based on Evan Gates' patch. - surf - surf browser, a WebKit ba… | |
| git clone git://git.suckless.org/surf | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit a9d733bd9f8d4534ad06ff6467431803df8c7efd | |
| parent 1d019cf8af6ffa2cd0f6d0bd9b6344e4924bb510 | |
| Author: Enno Boland (tox) <[email protected]> | |
| Date: Tue, 27 Oct 2009 08:11:44 +0100 | |
| fixing downloads based on Evan Gates' patch. | |
| Diffstat: | |
| M config.def.h | 1 + | |
| M surf.c | 46 ++++++++++++++++++++++++-----… | |
| 2 files changed, 37 insertions(+), 10 deletions(-) | |
| --- | |
| diff --git a/config.def.h b/config.def.h | |
| @@ -42,4 +42,5 @@ static Item items[] = { | |
| { "Stop", stop, { 0 } }, | |
| { "Paste URI", clipboard, { .b = TRUE } }, | |
| { "Copy URI", clipboard, { .b = FALSE } }, | |
| + { "Download", download, { 0 } }, | |
| }; | |
| diff --git a/surf.c b/surf.c | |
| @@ -76,7 +76,7 @@ static gboolean decidewindow(WebKitWebView *v, WebKitWebFrame… | |
| static void destroyclient(Client *c); | |
| static void destroywin(GtkWidget* w, Client *c); | |
| static void die(char *str); | |
| -static void download(WebKitDownload *o, GParamSpec *pspec, Client *c); | |
| +static void download(Client *c, const Arg *arg); | |
| static void drawindicator(Client *c); | |
| static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c); | |
| static char *geturi(Client *c); | |
| @@ -110,6 +110,7 @@ static void stop(Client *c, const Arg *arg); | |
| static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const char* t… | |
| static void usage(void); | |
| static void update(Client *c); | |
| +static void updatedownload(WebKitDownload *o, GParamSpec *pspec, Client *c); | |
| static void updatewinid(Client *c); | |
| static void windowobjectcleared(GtkWidget *w, WebKitWebFrame *frame, JSContext… | |
| static void zoom(Client *c, const Arg *arg); | |
| @@ -232,6 +233,15 @@ destroyclient(Client *c) { | |
| } | |
| gboolean | |
| +mime_policy_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRe… | |
| + if(webkit_web_view_can_show_mime_type(web_view, mime_type)) | |
| + webkit_web_policy_decision_use(policy_decision); | |
| + else | |
| + webkit_web_policy_decision_download(policy_decision); | |
| + return TRUE; | |
| +} | |
| + | |
| +gboolean | |
| decidewindow(WebKitWebView *view, WebKitWebFrame *f, WebKitNetworkRequest *r, … | |
| Arg arg; | |
| @@ -285,14 +295,18 @@ exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *… | |
| } | |
| void | |
| -download(WebKitDownload *o, GParamSpec *pspec, Client *c) { | |
| - WebKitDownloadStatus status; | |
| +download(Client *c, const Arg *arg) { | |
| + char *uri; | |
| + WebKitNetworkRequest *r; | |
| + WebKitDownload *dl; | |
| - status = webkit_download_get_status(c->download); | |
| - if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status == WEBKIT_DOWNLO… | |
| - c->progress = (gint)(webkit_download_get_progress(c->download)… | |
| - } | |
| - update(c); | |
| + if(arg->v) | |
| + uri = (char *)arg->v; | |
| + else | |
| + uri = c->linkhover ? c->linkhover : geturi(c); | |
| + r = webkit_network_request_new(uri); | |
| + dl = webkit_download_new(r); | |
| + initdownload(c->view, dl, c); | |
| } | |
| const char * | |
| @@ -322,6 +336,8 @@ initdownload(WebKitWebView *view, WebKitDownload *o, Client… | |
| stop(c, NULL); | |
| c->download = o; | |
| filename = webkit_download_get_suggested_filename(o); | |
| + if(!strcmp("", filename)) | |
| + filename = "index.html"; | |
| uri = g_strconcat("file://", dldir, "/", filename, NULL); | |
| webkit_download_set_destination_uri(c->download, uri); | |
| c->progress = 0; | |
| @@ -329,8 +345,8 @@ initdownload(WebKitWebView *view, WebKitDownload *o, Client… | |
| html = g_strdup_printf("Download <b>%s</b>...", filename); | |
| webkit_web_view_load_html_string(c->view, html, | |
| webkit_download_get_uri(c->download)); | |
| - g_signal_connect(c->download, "notify::progress", G_CALLBACK(download)… | |
| - g_signal_connect(c->download, "notify::status", G_CALLBACK(download), … | |
| + g_signal_connect(c->download, "notify::progress", G_CALLBACK(updatedow… | |
| + g_signal_connect(c->download, "notify::status", G_CALLBACK(updatedownl… | |
| webkit_download_start(c->download); | |
| c->title = copystr(&c->title, filename); | |
| @@ -753,7 +769,17 @@ update(Client *c) { | |
| drawindicator(c); | |
| gtk_window_set_title(GTK_WINDOW(c->win), t); | |
| g_free(t); | |
| +} | |
| + | |
| +void | |
| +updatedownload(WebKitDownload *o, GParamSpec *pspec, Client *c) { | |
| + WebKitDownloadStatus status; | |
| + status = webkit_download_get_status(c->download); | |
| + if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status == WEBKIT_DOWNLO… | |
| + c->progress = (gint)(webkit_download_get_progress(c->download)… | |
| + } | |
| + update(c); | |
| } | |
| void |