surf-dlconsole-20190919-d068a38.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
surf-dlconsole-20190919-d068a38.diff (7159B)
---
1 From 0ea5ecb238b932c533413b912b7981a737af56cf Mon Sep 17 00:00:00 2001
2 From: danoloan10 <danoloan10@tutanota.com>
3 Date: Thu, 19 Sep 2019 18:25:59 +0200
4 Subject: [PATCH] Basic integrated downloads via console display
5
6 ---
7 config.def.h | 16 ++++---
8 surf.c | 118 +++++++++++++++++++++++++++++++++++++++------------
9 2 files changed, 101 insertions(+), 33 deletions(-)
10
11 diff --git a/config.def.h b/config.def.h
12 index 34265f6..375be93 100644
13 --- a/config.def.h
14 +++ b/config.def.h
15 @@ -6,6 +6,8 @@ static char *styledir = "~/.surf/styles/";
16 static char *certdir = "~/.surf/certificates/";
17 static char *cachedir = "~/.surf/cache/";
18 static char *cookiefile = "~/.surf/cookies.txt";
19 +static char *dldir = "~/dl/";
20 +static char *dlstatus = "~/.surf/dlstatus/";
21
22 /* Webkit default features */
23 /* Highest priority value will be used.
24 @@ -76,13 +78,12 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE |
25 } \
26 }
27
28 -/* DOWNLOAD(URI, referer) */
29 -#define DOWNLOAD(u, r) { \
30 +#define DLSTATUS { \
31 .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\
32 - "curl -g -L -J -O -A \"$1\" -b \"$2\" -c \"$2\"" \
33 - " -e \"$3\" \"$4\"; read", \
34 - "surf-download", useragent, cookiefile, r, u, NULL \
35 - } \
36 + "while true; do cat $1/* 2>/dev/null || echo \"no hay descargas\";"\
37 + "A=; read A; "\
38 + "if [ $A = \"clean\" ]; then rm $1/*; fi; clear; done",\
39 + "surf-dlstatus", dlstatus, NULL } \
40 }
41
42 /* PLUMB(URI) */
43 @@ -180,6 +181,9 @@ static Key keys[] = {
44 { MODKEY|GDK_SHIFT_MASK, GDK_KEY_b, toggle, { .i = ScrollBars } },
45 { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t, toggle, { .i = StrictTLS } },
46 { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } },
47 +
48 + /* download-console */
49 + { MODKEY, GDK_KEY_d, spawndls, { 0 } },
50 };
51
52 /* button definitions */
53 diff --git a/surf.c b/surf.c
54 index 2b54e3c..771858e 100644
55 --- a/surf.c
56 +++ b/surf.c
57 @@ -205,10 +205,6 @@ static void decidenewwindow(WebKitPolicyDecision *d, Client *c);
58 static void decideresource(WebKitPolicyDecision *d, Client *c);
59 static void insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e,
60 Client *c);
61 -static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d,
62 - Client *c);
63 -static void responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c);
64 -static void download(Client *c, WebKitURIResponse *r);
65 static void webprocessterminated(WebKitWebView *v,
66 WebKitWebProcessTerminationReason r,
67 Client *c);
68 @@ -237,6 +233,17 @@ static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h);
69 static void clicknewwindow(Client *c, const Arg *a, WebKitHitTestResult *h);
70 static void clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h);
71
72 +/* download-console */
73 +static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d,
74 + Client *c);
75 +static void downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg);
76 +static void downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg);
77 +static gboolean decidedestination(WebKitDownload *d,
78 + gchar *suggested_filename, void *arg);
79 +static void printprogress(WebKitDownload *d, GParamSpec *ps, void *arg);
80 +static void logdownload(WebKitDownload *d, gchar *tail);
81 +static void spawndls(Client *c, const Arg *a);
82 +
83 static char winid[64];
84 static char togglestats[12];
85 static char pagestats[2];
86 @@ -340,6 +347,8 @@ setup(void)
87 scriptfile = buildfile(scriptfile);
88 cachedir = buildpath(cachedir);
89 certdir = buildpath(certdir);
90 + dlstatus = buildpath(dlstatus);
91 + dldir = buildpath(dldir);
92
93 gdkkb = gdk_seat_get_keyboard(gdk_display_get_default_seat(gdpy));
94
95 @@ -1079,6 +1088,8 @@ cleanup(void)
96 g_free(scriptfile);
97 g_free(stylefile);
98 g_free(cachedir);
99 + g_free(dldir);
100 + g_free(dlstatus);
101 XCloseDisplay(dpy);
102 }
103
104 @@ -1710,8 +1721,7 @@ decideresource(WebKitPolicyDecision *d, Client *c)
105 if (webkit_response_policy_decision_is_mime_type_supported(r)) {
106 webkit_policy_decision_use(d);
107 } else {
108 - webkit_policy_decision_ignore(d);
109 - download(c, res);
110 + webkit_policy_decision_download(d);
111 }
112 }
113
114 @@ -1721,27 +1731,6 @@ insecurecontent(WebKitWebView *v, WebKitInsecureContentEvent e, Client *c)
115 c->insecure = 1;
116 }
117
118 -void
119 -downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c)
120 -{
121 - g_signal_connect(G_OBJECT(d), "notify::response",
122 - G_CALLBACK(responsereceived), c);
123 -}
124 -
125 -void
126 -responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c)
127 -{
128 - download(c, webkit_download_get_response(d));
129 - webkit_download_cancel(d);
130 -}
131 -
132 -void
133 -download(Client *c, WebKitURIResponse *r)
134 -{
135 - Arg a = (Arg)DOWNLOAD(webkit_uri_response_get_uri(r), geturi(c));
136 - spawn(c, &a);
137 -}
138 -
139 void
140 webprocessterminated(WebKitWebView *v, WebKitWebProcessTerminationReason r,
141 Client *c)
142 @@ -1971,6 +1960,81 @@ clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h)
143 spawn(c, &arg);
144 }
145
146 +/* download-console */
147 +
148 +void
149 +downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c)
150 +{
151 + webkit_download_set_allow_overwrite(d, TRUE);
152 + g_signal_connect(G_OBJECT(d), "decide-destination",
153 + G_CALLBACK(decidedestination), NULL);
154 + g_signal_connect(G_OBJECT(d), "notify::estimated-progress",
155 + G_CALLBACK(printprogress), NULL);
156 + g_signal_connect(G_OBJECT(d), "failed",
157 + G_CALLBACK(downloadfailed), NULL);
158 + g_signal_connect(G_OBJECT(d), "finished",
159 + G_CALLBACK(downloadfinished), NULL);
160 +}
161 +
162 +void
163 +downloadfailed(WebKitDownload *d, GParamSpec *ps, void *arg)
164 +{
165 + logdownload(d, " -- FAILED");
166 +}
167 +
168 +void
169 +downloadfinished(WebKitDownload *d, GParamSpec *ps, void *arg)
170 +{
171 + logdownload(d, " -- COMPLETED");
172 +}
173 +
174 +gboolean
175 +decidedestination(WebKitDownload *d, gchar *suggested_filename, void *arg)
176 +{
177 + gchar *dest;
178 + dest = g_strdup_printf("file://%s/%s", dldir, suggested_filename);
179 + webkit_download_set_destination(d, dest);
180 + return TRUE;
181 +}
182 +
183 +void
184 +printprogress(WebKitDownload *d, GParamSpec *ps, void *arg)
185 +{
186 + logdownload(d, "");
187 +}
188 +
189 +void
190 +logdownload(WebKitDownload *d, gchar *tail)
191 +{
192 + gchar *filename, *statfile;
193 + FILE *stat;
194 +
195 + filename = g_path_get_basename(webkit_download_get_destination(d));
196 + statfile = g_strdup_printf("%s/%s", dlstatus, filename);
197 +
198 + if ((stat = fopen(statfile, "w")) == NULL) {
199 + perror("dlstatus");
200 + } else {
201 + fprintf(stat, "%s: %d%% (%d.%ds)%s\n",
202 + filename,
203 + (int)(webkit_download_get_estimated_progress(d) * 100),
204 + (int) webkit_download_get_elapsed_time(d),
205 + (int)(webkit_download_get_elapsed_time(d) * 100),
206 + tail);
207 + fclose(stat);
208 + }
209 +
210 + g_free(statfile);
211 + g_free(filename);
212 +}
213 +
214 +void
215 +spawndls(Client *c, const Arg *a)
216 +{
217 + Arg arg = (Arg)DLSTATUS;
218 + spawn(c, &arg);
219 +}
220 +
221 int
222 main(int argc, char *argv[])
223 {
224 --
225 2.22.1
226