commit 741c07a7432bd896536c683c08d369f33a6bf11f
Author: danoloan10 <[email protected]>
Date:   Thu Sep 19 18:44:42 2019 +0200

    Added dlconsole patch to surf
    
    This patch adds built-in downloads with a customizable console display

diff --git a/surf.suckless.org/patches/dlconsole/index.md 
b/surf.suckless.org/patches/dlconsole/index.md
new file mode 100644
index 00000000..543c018c
--- /dev/null
+++ b/surf.suckless.org/patches/dlconsole/index.md
@@ -0,0 +1,24 @@
+Built-in downloading with console display
+=========================================
+
+Description
+-----------
+
+This patch removes the original downloading method of calling
+an external tool and adds built-in support for downloads, along with
+a simple console display with a list of downloads.
+
+To open the downloads list, press Ctrl+D. This list must be manually
+refreshed: simply press enter to do so. If you enter `clean` as a command,
+the list will be cleared. The shell command called to show the downloads
+is defined by the macro `DLSTATUS` in the `config.def.h` file.
+
+Download
+--------
+
+* [surf-dlconsole-20190919-d068a38.diff](surf-dlconsole-20190919-d068a38.diff) 
(20190919)
+
+Author
+------
+
+* danoloan10 <[email protected]>
diff --git 
a/surf.suckless.org/patches/dlconsole/surf-dlconsole-20190919-d068a38.diff 
b/surf.suckless.org/patches/dlconsole/surf-dlconsole-20190919-d068a38.diff
new file mode 100644
index 00000000..28a49e04
--- /dev/null
+++ b/surf.suckless.org/patches/dlconsole/surf-dlconsole-20190919-d068a38.diff
@@ -0,0 +1,226 @@
+From 0ea5ecb238b932c533413b912b7981a737af56cf Mon Sep 17 00:00:00 2001
+From: danoloan10 <[email protected]>
+Date: Thu, 19 Sep 2019 18:25:59 +0200
+Subject: [PATCH] Basic integrated downloads via console display
+
+---
+ config.def.h |  16 ++++---
+ surf.c       | 118 +++++++++++++++++++++++++++++++++++++++------------
+ 2 files changed, 101 insertions(+), 33 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 34265f6..375be93 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -6,6 +6,8 @@ static char *styledir       = "~/.surf/styles/";
+ static char *certdir        = "~/.surf/certificates/";
+ static char *cachedir       = "~/.surf/cache/";
+ static char *cookiefile     = "~/.surf/cookies.txt";
++static char *dldir          = "~/dl/";
++static char *dlstatus       = "~/.surf/dlstatus/";
+ 
+ /* Webkit default features */
+ /* Highest priority value will be used.
+@@ -76,13 +78,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) */
+@@ -180,6 +181,9 @@ static Key keys[] = {
+       { MODKEY|GDK_SHIFT_MASK, GDK_KEY_b,      toggle,     { .i = ScrollBars 
} },
+       { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t,      toggle,     { .i = StrictTLS } 
},
+       { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m,      toggle,     { .i = Style } },
++
++      /* download-console */
++      { MODKEY,                GDK_KEY_d,      spawndls,   { 0 } },
+ };
+ 
+ /* button definitions */
+diff --git a/surf.c b/surf.c
+index 2b54e3c..771858e 100644
+--- a/surf.c
++++ b/surf.c
+@@ -205,10 +205,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);
+@@ -237,6 +233,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];
+@@ -340,6 +347,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));
+ 
+@@ -1079,6 +1088,8 @@ cleanup(void)
+       g_free(scriptfile);
+       g_free(stylefile);
+       g_free(cachedir);
++      g_free(dldir);
++      g_free(dlstatus);
+       XCloseDisplay(dpy);
+ }
+ 
+@@ -1710,8 +1721,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);
+       }
+ }
+ 
+@@ -1721,27 +1731,6 @@ insecurecontent(WebKitWebView *v, 
WebKitInsecureContentEvent e, Client *c)
+       c->insecure = 1;
+ }
+ 
+-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)
+@@ -1971,6 +1960,81 @@ clickexternplayer(Client *c, const Arg *a, 
WebKitHitTestResult *h)
+       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
",
++                      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[])
+ {
+-- 
+2.22.1
+


Reply via email to