diff --git a/programs/surf/config.def.h b/programs/surf/config.def.h index ef447213..8bb427f6 100644 --- a/programs/surf/config.def.h +++ b/programs/surf/config.def.h @@ -6,6 +6,13 @@ 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/"; + +static SearchEngine searchengines[] = { + { " ", "https://duckduckgo.com/?q=%s" }, + { "g ", "https://google.com/search?q=%s" }, +}; /* Webkit default features */ /* Highest priority value will be used. @@ -74,13 +81,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 downloads yet.\";"\ + "A=; read A; "\ + "if [ $A = \"clean\" ]; then rm $1/*; fi; clear; done",\ + "surf-dlstatus", dlstatus, NULL } \ } /* PLUMB(URI) */ @@ -177,6 +183,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/programs/surf/config.h b/programs/surf/config.h index ef447213..8bb427f6 100644 --- a/programs/surf/config.h +++ b/programs/surf/config.h @@ -6,6 +6,13 @@ 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/"; + +static SearchEngine searchengines[] = { + { " ", "https://duckduckgo.com/?q=%s" }, + { "g ", "https://google.com/search?q=%s" }, +}; /* Webkit default features */ /* Highest priority value will be used. @@ -74,13 +81,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 downloads yet.\";"\ + "A=; read A; "\ + "if [ $A = \"clean\" ]; then rm $1/*; fi; clear; done",\ + "surf-dlstatus", dlstatus, NULL } \ } /* PLUMB(URI) */ @@ -177,6 +183,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/programs/surf/patches/surf-dlconsole-20190919-d068a38.diff b/programs/surf/patches/surf-dlconsole-20190919-d068a38.diff new file mode 100644 index 00000000..cf605ff0 --- /dev/null +++ b/programs/surf/patches/surf-dlconsole-20190919-d068a38.diff @@ -0,0 +1,226 @@ +From 0ea5ecb238b932c533413b912b7981a737af56cf Mon Sep 17 00:00:00 2001 +From: danoloan10 +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 downloads yet.\";"\ ++ "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\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[]) + { +-- +2.22.1 + diff --git a/programs/surf/patches/surf-searchengines-20220804-609ea1c.diff b/programs/surf/patches/surf-searchengines-20220804-609ea1c.diff new file mode 100644 index 00000000..32aca05e --- /dev/null +++ b/programs/surf/patches/surf-searchengines-20220804-609ea1c.diff @@ -0,0 +1,94 @@ +From 2f64431f15777d93d146707dccdb6ad063c7a316 Mon Sep 17 00:00:00 2001 +From: Justinas Grigas +Date: Thu, 4 Aug 2022 23:18:40 +0300 +Subject: [PATCH] searchengines: allows simple use of search engines + +The previous patches had some issues: +* don't apply cleanly to the latest version. +* a space between the token and query is implied, so having " " as a + token means you actually have to use " ". Or if your token is "e", + searching for "example.com" would trigger it. Now you specify the exact + token to look for. +* has checks to skip badly configured search engines. The correct + solution is to configure them right. + +Now it works like a better version of the spacesearch patch, as it +allows you to specify " " as a token +--- + config.def.h | 5 +++++ + surf.c | 22 +++++++++++++++++++++- + 2 files changed, 26 insertions(+), 1 deletion(-) + +diff --git a/config.def.h b/config.def.h +index 075f7d0..7bb9c46 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -8,6 +8,11 @@ static char *cachedir = "~/.local/share/surf/cache/"; + static char *cookiefile = "~/.local/share/surf/cookies.txt"; + static char *historyfile = "~/.local/share/surf/history.txt"; + ++static SearchEngine searchengines[] = { ++ { " ", "https://duckduckgo.com/?q=%s" }, ++ { "osrs ", "https://oldschool.runescape.wiki/?search=%s" }, ++}; ++ + /* Webkit default features */ + /* Highest priority value will be used. + * Default parameters are priority 0 +diff --git a/surf.c b/surf.c +index a2b507c..7e85952 100644 +--- a/surf.c ++++ b/surf.c +@@ -133,6 +133,11 @@ typedef struct { + unsigned int stopevent; + } Button; + ++typedef struct { ++ char *token; ++ char *uri; ++} SearchEngine; ++ + typedef struct { + const char *uri; + Parameter config[ParameterLast]; +@@ -220,6 +225,7 @@ static void webprocessterminated(WebKitWebView *v, + Client *c); + static void closeview(WebKitWebView *v, Client *c); + static void destroywin(GtkWidget* w, Client *c); ++static gchar *parseuri(const gchar *uri); + + /* Hotkeys */ + static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); +@@ -584,7 +590,7 @@ loaduri(Client *c, const Arg *a) + url = g_strdup_printf("file://%s", path); + free(path); + } else { +- url = g_strdup_printf("http://%s", uri); ++ url = parseuri(uri); + } + if (apath != uri) + free(apath); +@@ -1811,6 +1817,20 @@ destroywin(GtkWidget* w, Client *c) + gtk_main_quit(); + } + ++gchar * ++parseuri(const gchar *uri) ++{ ++ guint i; ++ ++ for (i = 0; i < LENGTH(searchengines); i++) { ++ if (g_str_has_prefix(uri, searchengines[i].token)) ++ return g_strdup_printf(searchengines[i].uri, ++ uri + strlen(searchengines[i].token)); ++ } ++ ++ return g_strdup_printf("http://%s", uri); ++} ++ + void + pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) + { +-- +2.37.1 + diff --git a/programs/surf/surf b/programs/surf/surf index 0d1ba2e1..cf81a0e8 100755 Binary files a/programs/surf/surf and b/programs/surf/surf differ diff --git a/programs/surf/surf.c b/programs/surf/surf.c index af0fa742..956718ba 100644 --- a/programs/surf/surf.c +++ b/programs/surf/surf.c @@ -129,6 +129,11 @@ typedef struct { unsigned int stopevent; } Button; +typedef struct { + char *token; + char *uri; +} SearchEngine; + typedef struct { const char *uri; Parameter config[ParameterLast]; @@ -207,15 +212,12 @@ 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); static void closeview(WebKitWebView *v, Client *c); static void destroywin(GtkWidget* w, Client *c); +static gchar *parseuri(const gchar *uri); /* Hotkeys */ static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); @@ -239,6 +241,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]; @@ -350,7 +363,10 @@ setup(void) cookiefile = buildfile(cookiefile); scriptfile = buildfile(scriptfile); certdir = buildpath(certdir); - if (curconfig[Ephemeral].val.i) + dlstatus = buildpath(dlstatus); + dldir = buildpath(dldir); + + if (curconfig[Ephemeral].val.i) cachedir = NULL; else cachedir = buildpath(cachedir); @@ -576,7 +592,7 @@ loaduri(Client *c, const Arg *a) url = g_strdup_printf("file://%s", path); free(path); } else { - url = g_strdup_printf("http://%s", uri); + url = parseuri(uri); } if (apath != uri) free(apath); @@ -1088,6 +1104,8 @@ cleanup(void) g_free(scriptfile); g_free(stylefile); g_free(cachedir); + g_free(dldir); + g_free(dlstatus); XCloseDisplay(dpy); } @@ -1721,8 +1739,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); } } @@ -1732,27 +1749,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) @@ -1776,6 +1772,20 @@ destroywin(GtkWidget* w, Client *c) gtk_main_quit(); } +gchar * +parseuri(const gchar *uri) +{ + guint i; + + for (i = 0; i < LENGTH(searchengines); i++) { + if (g_str_has_prefix(uri, searchengines[i].token)) + return g_strdup_printf(searchengines[i].uri, + uri + strlen(searchengines[i].token)); + } + + return g_strdup_printf("http://%s", uri); +} + void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) { @@ -1985,6 +1995,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\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[]) {