surf

Simple browser by suckless.org (fork)
git clone git://git.ckyln.com/surf.git
Log | Files | Refs | README | LICENSE

commit e4568ecc764599158b985bc2eb33d00593fff04e
parent 789a8937e64aff9aeaf437151124c6ba6ddf551c
Author: Cem Keylan <cem@ckyln.com>
Date:   Tue, 26 Nov 2019 16:17:37 +0300

add dlconsole patch

Diffstat:
Mconfig.def.h | 14++++++++------
Msurf.c | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
2 files changed, 99 insertions(+), 33 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -8,6 +8,8 @@ static char *cachedir = "~/.surf/cache/"; static char *cookiefile = "~/.surf/cookies.txt"; static char *historyfile = "~/.surf/history.txt"; static char *searchurl = "duckduckgo.com/?q=%s"; +static char *dldir = "~/dl/"; +static char *dlstatus = "~/.surf/dlstatus/"; /* Webkit default features */ /* Highest priority value will be used. @@ -86,13 +88,12 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | } \ } -/* DOWNLOAD(URI, referer) */ -#define DOWNLOAD(u, r) { \ +#define DLSTATUS { \ .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\ - "curl -g -L -J -O -A \"$1\" -b \"$2\" -c \"$2\"" \ - " -e \"$3\" \"$4\"; read", \ - "surf-download", useragent, cookiefile, r, u, NULL \ - } \ + "while true; do cat $1/* 2>/dev/null || echo \"no hay descargas\";"\ + "A=; read A; "\ + "if [ $A = \"clean\" ]; then rm $1/*; fi; clear; done",\ + "surf-dlstatus", dlstatus, NULL } \ } /* PLUMB(URI) */ @@ -237,6 +238,7 @@ static Key keys[] = { { 0, GDK_KEY_m, spawn, ADDBMK }, { 0|GDK_SHIFT_MASK, GDK_KEY_m, spawn, LOADBMK("_SURF_URI", "_SURF_GO", PROMPT_GO) }, { MODKEY, GDK_KEY_w, playexternal, { 0 } }, + { 0|GDK_SHIFT_MASK, GDK_KEY_d, spawndls, { 0 } }, }; /* button definitions */ diff --git a/surf.c b/surf.c @@ -207,10 +207,6 @@ static void decidenewwindow(WebKitPolicyDecision *d, Client *c); static void decideresource(WebKitPolicyDecision *d, Client *c); static void insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, Client *c); -static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, - Client *c); -static void responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c); -static void download(Client *c, WebKitURIResponse *r); static void webprocessterminated(WebKitWebView *v, WebKitWebProcessTerminationReason r, Client *c); @@ -243,6 +239,17 @@ static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h); static void clicknewwindow(Client *c, const Arg *a, WebKitHitTestResult *h); static void clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h); +/* download-console */ +static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, + Client *c); +static void downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg); +static void downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg); +static gboolean decidedestination(WebKitDownload *d, + gchar *suggested_filename, void *arg); +static void printprogress(WebKitDownload *d, GParamSpec *ps, void *arg); +static void logdownload(WebKitDownload *d, gchar *tail); +static void spawndls(Client *c, const Arg *a); + static char winid[64]; static char togglestats[12]; static char pagestats[2]; @@ -422,6 +429,8 @@ setup(void) scriptfile = buildfile(scriptfile); cachedir = buildpath(cachedir); certdir = buildpath(certdir); + dlstatus = buildpath(dlstatus); + dldir = buildpath(dldir); gdkkb = gdk_seat_get_keyboard(gdk_display_get_default_seat(gdpy)); @@ -1175,6 +1184,8 @@ cleanup(void) g_free(scriptfile); g_free(stylefile); g_free(cachedir); + g_free(dldir); + g_free(dlstatus); XCloseDisplay(dpy); } @@ -1830,8 +1841,7 @@ decideresource(WebKitPolicyDecision *d, Client *c) if (webkit_response_policy_decision_is_mime_type_supported(r)) { webkit_policy_decision_use(d); } else { - webkit_policy_decision_ignore(d); - download(c, res); + webkit_policy_decision_download(d); } } @@ -1842,27 +1852,6 @@ insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, Client *c) } void -downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c) -{ - g_signal_connect(G_OBJECT(d), "notify::response", - G_CALLBACK(responsereceived), c); -} - -void -responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c) -{ - download(c, webkit_download_get_response(d)); - webkit_download_cancel(d); -} - -void -download(Client *c, WebKitURIResponse *r) -{ - Arg a = (Arg)DOWNLOAD(webkit_uri_response_get_uri(r), geturi(c)); - spawn(c, &a); -} - -void webprocessterminated(WebKitWebView *v, WebKitWebProcessTerminationReason r, Client *c) { @@ -2106,6 +2095,81 @@ playexternal(Client *c, const Arg *a) spawn(c, &arg); } +/* download-console */ + +void +downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c) +{ + webkit_download_set_allow_overwrite(d, TRUE); + g_signal_connect(G_OBJECT(d), "decide-destination", + G_CALLBACK(decidedestination), NULL); + g_signal_connect(G_OBJECT(d), "notify::estimated-progress", + G_CALLBACK(printprogress), NULL); + g_signal_connect(G_OBJECT(d), "failed", + G_CALLBACK(downloadfailed), NULL); + g_signal_connect(G_OBJECT(d), "finished", + G_CALLBACK(downloadfinished), NULL); +} + +void +downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg) +{ + logdownload(d, " -- FAILED"); +} + +void +downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg) +{ + logdownload(d, " -- COMPLETED"); +} + +gboolean +decidedestination(WebKitDownload *d, gchar *suggested_filename, void *arg) +{ + gchar *dest; + dest = g_strdup_printf("file://%s/%s", dldir, suggested_filename); + webkit_download_set_destination(d, dest); + return TRUE; +} + +void +printprogress(WebKitDownload *d, GParamSpec *ps, void *arg) +{ + logdownload(d, ""); +} + +void +logdownload(WebKitDownload *d, gchar *tail) +{ + gchar *filename, *statfile; + FILE *stat; + + filename = g_path_get_basename(webkit_download_get_destination(d)); + statfile = g_strdup_printf("%s/%s", dlstatus, filename); + + if ((stat = fopen(statfile, "w")) == NULL) { + perror("dlstatus"); + } else { + fprintf(stat, "%s: %d%% (%d.%ds)%s\n", + filename, + (int)(webkit_download_get_estimated_progress(d) * 100), + (int) webkit_download_get_elapsed_time(d), + (int)(webkit_download_get_elapsed_time(d) * 100), + tail); + fclose(stat); + } + + g_free(statfile); + g_free(filename); +} + +void +spawndls(Client *c, const Arg *a) +{ + Arg arg = (Arg)DLSTATUS; + spawn(c, &arg); +} + int main(int argc, char *argv[]) {