surf-0.5-download.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
surf-0.5-download.diff (6076B) | |
--- | |
1 diff --git a/config.def.h b/config.def.h | |
2 index 1cba4d7..3065c73 100644 | |
3 --- a/config.def.h | |
4 +++ b/config.def.h | |
5 @@ -11,6 +11,7 @@ static char *progress_proxy_untrust = "#FF6600"; | |
6 static char *stylefile = "~/.surf/style.css"; | |
7 static char *scriptfile = "~/.surf/script.js"; | |
8 static char *cookiefile = "~/.surf/cookies.txt"; | |
9 +static char *downdir = "/tmp"; | |
10 static time_t sessiontime = 3600; | |
11 static char *cafile = "/etc/ssl/certs/ca-certificates.crt"; | |
12 static char *strictssl = FALSE; /* Refuse untrusted SSL connection… | |
13 diff --git a/surf.c b/surf.c | |
14 index c9fa08d..4d589aa 100644 | |
15 --- a/surf.c | |
16 +++ b/surf.c | |
17 @@ -114,6 +114,7 @@ static void destroyclient(Client *c); | |
18 static void destroywin(GtkWidget* w, Client *c); | |
19 static void die(const char *errstr, ...); | |
20 static void drawindicator(Client *c); | |
21 +static void download(WebKitDownload *o, GParamSpec *pspec, Client *c); | |
22 static void eval(Client *c, const Arg *arg); | |
23 static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client… | |
24 static void find(Client *c, const Arg *arg); | |
25 @@ -289,6 +290,50 @@ cookiejar_set_property(GObject *self, guint prop_id… | |
26 flock(COOKIEJAR(self)->lock, LOCK_UN); | |
27 } | |
28 | |
29 +struct client_size_tuple { | |
30 + Client* c; | |
31 + gint s; | |
32 +}; | |
33 + | |
34 +static void | |
35 +late_download_update(WebKitWebView* view, GParamSpec *pspec, struct cli… | |
36 + char script[1024]; char* s= script; | |
37 + snprintf(script, 1024, "c(%d, %d)", t->s, t->s); | |
38 + const Arg a= {.v = (void*) &s}; | |
39 + eval(t->c, &a); | |
40 + free(t); | |
41 +} | |
42 + | |
43 +static void | |
44 +download(WebKitDownload *o, GParamSpec *pspec, Client *c) { | |
45 + WebKitDownloadStatus status; | |
46 + char script[2048]; char* s= script; | |
47 + | |
48 + status = webkit_download_get_status(o); | |
49 + if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status == WEBKIT… | |
50 + snprintf(script, 2048, "u(%d, %d, %d)", | |
51 + (gint)webkit_download_get_current_size(o), | |
52 + (gint)webkit_download_get_total_size(o), | |
53 + (gint)(webkit_download_get_progress(o) * 100)); | |
54 + const Arg a= {.v = (void*) &s}; | |
55 + eval(c, &a); | |
56 + } | |
57 + else if (status == WEBKIT_DOWNLOAD_STATUS_FINISHED){ | |
58 + if( webkit_web_view_get_load_status(c->view) == WEBKIT_… | |
59 + snprintf(script, 2048, "c(%d, %d)", | |
60 + (gint)webkit_download_get_current_size(… | |
61 + (gint)webkit_download_get_total_size(o)… | |
62 + const Arg a= {.v = (void*) &s}; | |
63 + eval(c, &a); | |
64 + } | |
65 + else { | |
66 + struct client_size_tuple* t= calloc(1, sizeof(s… | |
67 + t->c= c; t->s= (gint)webkit_download_get_curren… | |
68 + g_signal_connect(c->view, "document-load-finish… | |
69 + } | |
70 + } | |
71 +} | |
72 + | |
73 static void | |
74 evalscript(JSContextRef js, char *script, char* scriptname) { | |
75 JSStringRef jsscript, jsscriptname; | |
76 @@ -496,12 +541,105 @@ geturi(Client *c) { | |
77 | |
78 static gboolean | |
79 initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) { | |
80 - Arg arg; | |
81 + gchar *uri, *path; | |
82 + const gchar *filename; | |
83 + Client *n; | |
84 + const char template[] = | |
85 +"<html>" \ | |
86 +"<head>" \ | |
87 +"<title>Download - %s</title>" \ | |
88 +"<script>" \ | |
89 +"function formText(x){" \ | |
90 +" if(x >= 1073741824) { return (Math.floor(x/10737418.24)/100) + \"G\… | |
91 +" else if(x >= 1048576){ return (Math.floor(x/10485.76)/100) + \"M\"; … | |
92 +" else if(x >= 1024) { return (Math.floor(x/10.24)/100) + \"k\"; }" \ | |
93 +" else { return x+\"b\"; }" \ | |
94 +"}" \ | |
95 +"function updateText(c,t){" \ | |
96 +" txt= formText(c) + \"/\" + formText(t);" \ | |
97 +" DLTEXT.textContent= txt;" \ | |
98 +" /* center text in bar */" \ | |
99 +" DLTEXT.setAttribute('x', 102-4.4*txt.length)" \ | |
100 +"}" \ | |
101 +"function c(c, t){" \ | |
102 +" DLGRAD.setAttribute('x2', 230);" \ | |
103 +" DLGRAD.setAttribute('x1', 205);" \ | |
104 +" updateText(c,t);" \ | |
105 +" document.getElementById('stop1').setAttribute('style', \"stop-color:… | |
106 +"}" \ | |
107 +"function u(c,t,p){" \ | |
108 +" DLGRAD.setAttribute('x2', Math.floor(p*205/100) + 25);" \ | |
109 +" DLGRAD.setAttribute('x1', Math.floor(p*205/100));" \ | |
110 +" updateText(c,t);" \ | |
111 +"}" \ | |
112 +"</script>" \ | |
113 +"</head>" \ | |
114 +"<body>" \ | |
115 +"<center>" \ | |
116 +"<h2>Downloading</h2>" \ | |
117 +"<h3>%s</h3>" \ | |
118 +"to %s<br/>" \ | |
119 +"<svg" \ | |
120 +" xmlns:cc=\"http://creativecommons.org/ns#\"" \ | |
121 +" xmlns:svg=\"http://www.w3.org/2000/svg\"" \ | |
122 +" xmlns=\"http://www.w3.org/2000/svg\"" \ | |
123 +" xmlns:xlink=\"http://www.w3.org/1999/xlink\"" \ | |
124 +" width=\"210\"" \ | |
125 +" height=\"60\"" \ | |
126 +" id=\"download\">" \ | |
127 +" <defs>" \ | |
128 +" <linearGradient" \ | |
129 +" id=\"dlgradient\"" \ | |
130 +" x1=\"0\"" \ | |
131 +" y1=\"0\"" \ | |
132 +" x2=\"25\"" \ | |
133 +" y2=\"0\"" \ | |
134 +" gradientUnits=\"userSpaceOnUse\">" \ | |
135 +" <stop style=\"stop-color:#00ff00;\" offset=\"0\" id=\"stop1\" />… | |
136 +" <stop style=\"stop-color:#00ff00;stop-opacity:0;\" offset=\"1\" … | |
137 +" </linearGradient>" \ | |
138 +" </defs>" \ | |
139 +" <rect" \ | |
140 +" style=\"fill:url(#dlgradient);stroke:#000000;stroke-width:3\"" \ | |
141 +" id=\"rect2985\"" \ | |
142 +" width=\"200\"" \ | |
143 +" height=\"50\"" \ | |
144 +" x=\"5\"" \ | |
145 +" y=\"5\"" \ | |
146 +" ry=\"25\" />" \ | |
147 +" <text id=\"dltext\" x=\"92\" y=\"35\">0/0</text>" \ | |
148 +"</svg>" \ | |
149 +"</center>" \ | |
150 +"<script>" \ | |
151 +"DLGRAD= document.getElementById('dlgradient');" \ | |
152 +"DLTEXT= document.getElementById('dltext');" \ | |
153 +"</script>" \ | |
154 +"</body>" \ | |
155 +"</html>"; | |
156 + char html[sizeof(template)+2048]; | |
157 + filename = webkit_download_get_suggested_filename(o); | |
158 + | |
159 + path = g_build_filename(downdir, filename, NULL); | |
160 + uri = g_filename_to_uri(path, NULL, NULL); | |
161 + | |
162 + webkit_download_set_destination_uri(o, uri); | |
163 + webkit_download_start(o); | |
164 + | |
165 + n = newclient(); | |
166 + snprintf(html, sizeof(template)+2048, template, filename, filen… | |
167 + webkit_web_view_load_string(n->view, html, NULL, NULL, NULL); | |
168 + | |
169 + g_signal_connect(o, "notify::progress", G_CALLBACK(download), n… | |
170 + g_signal_connect(o, "notify::status", G_CALLBACK(download), n); | |
171 + | |
172 + n->title = g_strdup_printf("Downloading %s", filename); | |
173 + n->progress = 0; | |
174 + update(n); | |
175 + | |
176 + g_free(path); | |
177 + g_free(uri); | |
178 | |
179 - updatewinid(c); | |
180 - arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o), geturi(… | |
181 - spawn(c, &arg); | |
182 - return FALSE; | |
183 + return TRUE; | |
184 } | |
185 | |
186 static void |