commit 976d18789711202fda559d11389afc9f7b41437b
parent 11dca18a2d148e5a6463aba783567a3815424963
Author: Mahdi Mirzade <[email protected]>
Date: Thu, 7 Apr 2022 03:34:11 +0430
Surf with bookmarks, history, mpv play, clipboard
Diffstat:
8 files changed, 503 insertions(+), 201 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -1,194 +0,0 @@
-/* modifier 0 means no modifier */
-static int surfuseragent = 1; /* Append Surf version to default WebKit user agent */
-static char *fulluseragent = ""; /* Or override the whole user agent string */
-static char *scriptfile = "~/.surf/script.js";
-static char *styledir = "~/.surf/styles/";
-static char *certdir = "~/.surf/certificates/";
-static char *cachedir = "~/.surf/cache/";
-static char *cookiefile = "~/.surf/cookies.txt";
-
-/* Webkit default features */
-/* Highest priority value will be used.
- * Default parameters are priority 0
- * Per-uri parameters are priority 1
- * Command parameters are priority 2
- */
-static Parameter defconfig[ParameterLast] = {
- /* parameter Arg value priority */
- [AccessMicrophone] = { { .i = 0 }, },
- [AccessWebcam] = { { .i = 0 }, },
- [Certificate] = { { .i = 0 }, },
- [CaretBrowsing] = { { .i = 0 }, },
- [CookiePolicies] = { { .v = "@Aa" }, },
- [DefaultCharset] = { { .v = "UTF-8" }, },
- [DiskCache] = { { .i = 1 }, },
- [DNSPrefetch] = { { .i = 0 }, },
- [Ephemeral] = { { .i = 0 }, },
- [FileURLsCrossAccess] = { { .i = 0 }, },
- [FontSize] = { { .i = 12 }, },
- [FrameFlattening] = { { .i = 0 }, },
- [Geolocation] = { { .i = 0 }, },
- [HideBackground] = { { .i = 0 }, },
- [Inspector] = { { .i = 0 }, },
- [Java] = { { .i = 1 }, },
- [JavaScript] = { { .i = 1 }, },
- [KioskMode] = { { .i = 0 }, },
- [LoadImages] = { { .i = 1 }, },
- [MediaManualPlay] = { { .i = 1 }, },
- [PreferredLanguages] = { { .v = (char *[]){ NULL } }, },
- [RunInFullscreen] = { { .i = 0 }, },
- [ScrollBars] = { { .i = 1 }, },
- [ShowIndicators] = { { .i = 1 }, },
- [SiteQuirks] = { { .i = 1 }, },
- [SmoothScrolling] = { { .i = 0 }, },
- [SpellChecking] = { { .i = 0 }, },
- [SpellLanguages] = { { .v = ((char *[]){ "en_US", NULL }) }, },
- [StrictTLS] = { { .i = 1 }, },
- [Style] = { { .i = 1 }, },
- [WebGL] = { { .i = 0 }, },
- [ZoomLevel] = { { .f = 1.0 }, },
-};
-
-static UriParameters uriparams[] = {
- { "(://|\\.)suckless\\.org(/|$)", {
- [JavaScript] = { { .i = 0 }, 1 },
- }, },
-};
-
-/* default window size: width, height */
-static int winsize[] = { 800, 600 };
-
-static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE |
- WEBKIT_FIND_OPTIONS_WRAP_AROUND;
-
-#define PROMPT_GO "Go:"
-#define PROMPT_FIND "Find:"
-
-/* SETPROP(readprop, setprop, prompt)*/
-#define SETPROP(r, s, p) { \
- .v = (const char *[]){ "/bin/sh", "-c", \
- "prop=\"$(printf '%b' \"$(xprop -id $1 "r" " \
- "| sed -e 's/^"r"(UTF8_STRING) = \"\\(.*\\)\"/\\1/' " \
- " -e 's/\\\\\\(.\\)/\\1/g')\" " \
- "| dmenu -p '"p"' -w $1)\" " \
- "&& xprop -id $1 -f "s" 8u -set "s" \"$prop\"", \
- "surf-setprop", winid, NULL \
- } \
-}
-
-/* DOWNLOAD(URI, referer) */
-#define DOWNLOAD(u, r) { \
- .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 \
- } \
-}
-
-/* PLUMB(URI) */
-/* This called when some URI which does not begin with "about:",
- * "http://" or "https://" should be opened.
- */
-#define PLUMB(u) {\
- .v = (const char *[]){ "/bin/sh", "-c", \
- "xdg-open \"$0\"", u, NULL \
- } \
-}
-
-/* VIDEOPLAY(URI) */
-#define VIDEOPLAY(u) {\
- .v = (const char *[]){ "/bin/sh", "-c", \
- "mpv --really-quiet \"$0\"", u, NULL \
- } \
-}
-
-/* styles */
-/*
- * The iteration will stop at the first match, beginning at the beginning of
- * the list.
- */
-static SiteSpecific styles[] = {
- /* regexp file in $styledir */
- { ".*", "default.css" },
-};
-
-/* certificates */
-/*
- * Provide custom certificate for urls
- */
-static SiteSpecific certs[] = {
- /* regexp file in $certdir */
- { "://suckless\\.org/", "suckless.org.crt" },
-};
-
-#define MODKEY GDK_CONTROL_MASK
-
-/* hotkeys */
-/*
- * If you use anything else but MODKEY and GDK_SHIFT_MASK, don't forget to
- * edit the CLEANMASK() macro.
- */
-static Key keys[] = {
- /* modifier keyval function arg */
- { MODKEY, GDK_KEY_g, spawn, SETPROP("_SURF_URI", "_SURF_GO", PROMPT_GO) },
- { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) },
- { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) },
-
- { 0, GDK_KEY_Escape, stop, { 0 } },
- { MODKEY, GDK_KEY_c, stop, { 0 } },
-
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_r, reload, { .i = 1 } },
- { MODKEY, GDK_KEY_r, reload, { .i = 0 } },
-
- { MODKEY, GDK_KEY_l, navigate, { .i = +1 } },
- { MODKEY, GDK_KEY_h, navigate, { .i = -1 } },
-
- /* vertical and horizontal scrolling, in viewport percentage */
- { MODKEY, GDK_KEY_j, scrollv, { .i = +10 } },
- { MODKEY, GDK_KEY_k, scrollv, { .i = -10 } },
- { MODKEY, GDK_KEY_space, scrollv, { .i = +50 } },
- { MODKEY, GDK_KEY_b, scrollv, { .i = -50 } },
- { MODKEY, GDK_KEY_i, scrollh, { .i = +10 } },
- { MODKEY, GDK_KEY_u, scrollh, { .i = -10 } },
-
-
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_j, zoom, { .i = -1 } },
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_k, zoom, { .i = +1 } },
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_q, zoom, { .i = 0 } },
- { MODKEY, GDK_KEY_minus, zoom, { .i = -1 } },
- { MODKEY, GDK_KEY_plus, zoom, { .i = +1 } },
-
- { MODKEY, GDK_KEY_p, clipboard, { .i = 1 } },
- { MODKEY, GDK_KEY_y, clipboard, { .i = 0 } },
-
- { MODKEY, GDK_KEY_n, find, { .i = +1 } },
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_n, find, { .i = -1 } },
-
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_p, print, { 0 } },
- { MODKEY, GDK_KEY_t, showcert, { 0 } },
-
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_a, togglecookiepolicy, { 0 } },
- { 0, GDK_KEY_F11, togglefullscreen, { 0 } },
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_o, toggleinspector, { 0 } },
-
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_c, toggle, { .i = CaretBrowsing } },
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_f, toggle, { .i = FrameFlattening } },
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_g, toggle, { .i = Geolocation } },
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_s, toggle, { .i = JavaScript } },
- { MODKEY|GDK_SHIFT_MASK, GDK_KEY_i, toggle, { .i = LoadImages } },
- { 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 } },
-};
-
-/* button definitions */
-/* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */
-static Button buttons[] = {
- /* target event mask button function argument stop event */
- { OnLink, 0, 2, clicknewwindow, { .i = 0 }, 1 },
- { OnLink, MODKEY, 2, clicknewwindow, { .i = 1 }, 1 },
- { OnLink, MODKEY, 1, clicknewwindow, { .i = 1 }, 1 },
- { OnAny, 0, 8, clicknavigate, { .i = -1 }, 1 },
- { OnAny, 0, 9, clicknavigate, { .i = +1 }, 1 },
- { OnMedia, MODKEY, 1, clickexternplayer, { 0 }, 1 },
-};
diff --git a/config.h b/config.h
@@ -0,0 +1,231 @@
+/* modifier 0 means no modifier */
+static int surfuseragent = 1; /* Append Surf version to default WebKit user agent */
+static char *fulluseragent = ""; /* Or override the whole user agent string */
+static char *scriptfile = "~/.config/surf/script.js";
+static char *styledir = "~/.config/surf/styles/";
+static char *certdir = "~/.config/surf/certificates/";
+static char *cachedir = "~/.config/surf/cache/";
+static char *cookiefile = "~/.config/surf/cookies.txt";
+#define HS_FILE "~/.config/surf/history"
+#define BM_FILE "~/.config/surf/bookmarks"
+
+static char *bookmarkfile = BM_FILE;
+static char *historyfile = HS_FILE;
+
+/* Webkit default features */
+/* Highest priority value will be used.
+ * Default parameters are priority 0
+ * Per-uri parameters are priority 1
+ * Command parameters are priority 2
+ */
+static Parameter defconfig[ParameterLast] = {
+ /* parameter Arg value priority */
+ [AccessMicrophone] = { { .i = 0 }, },
+ [AccessWebcam] = { { .i = 0 }, },
+ [Certificate] = { { .i = 0 }, },
+ [CaretBrowsing] = { { .i = 0 }, },
+ [CookiePolicies] = { { .v = "@Aa" }, },
+ [DefaultCharset] = { { .v = "UTF-8" }, },
+ [DiskCache] = { { .i = 1 }, },
+ [DNSPrefetch] = { { .i = 0 }, },
+ [Ephemeral] = { { .i = 0 }, },
+ [FileURLsCrossAccess] = { { .i = 0 }, },
+ [FontSize] = { { .i = 12 }, },
+ [FrameFlattening] = { { .i = 0 }, },
+ [Geolocation] = { { .i = 0 }, },
+ [HideBackground] = { { .i = 0 }, },
+ [Inspector] = { { .i = 0 }, },
+ [Java] = { { .i = 1 }, },
+ [JavaScript] = { { .i = 1 }, },
+ [KioskMode] = { { .i = 0 }, },
+ [LoadImages] = { { .i = 1 }, },
+ [MediaManualPlay] = { { .i = 1 }, },
+ [PreferredLanguages] = { { .v = (char *[]){ NULL } }, },
+ [RunInFullscreen] = { { .i = 0 }, },
+ [ScrollBars] = { { .i = 1 }, },
+ [ShowIndicators] = { { .i = 0 }, },
+ [SiteQuirks] = { { .i = 1 }, },
+ [SmoothScrolling] = { { .i = 0 }, },
+ [SpellChecking] = { { .i = 0 }, },
+ [SpellLanguages] = { { .v = ((char *[]){ "en_US", NULL }) }, },
+ [StrictTLS] = { { .i = 1 }, },
+ [Style] = { { .i = 1 }, },
+ [WebGL] = { { .i = 0 }, },
+ [ZoomLevel] = { { .f = 0.8 }, },
+ [ClipboardNotPrimary] = { { .i = 1 }, },
+};
+
+static UriParameters uriparams[] = {
+ { "(://|\\.)suckless\\.org(/|$)", {
+ [JavaScript] = { { .i = 0 }, 1 },
+ }, },
+};
+
+/* default window size: width, height */
+static int winsize[] = { 800, 600 };
+
+static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE |
+ WEBKIT_FIND_OPTIONS_WRAP_AROUND;
+
+#define PROMPT_GO "Go:"
+#define PROMPT_FIND "Find:"
+
+/* SETPROP(readprop, setprop, prompt)*/
+#define SETPROP(r, s, p) { \
+ .v = (const char *[]){ "/bin/sh", "-c", \
+ "prop=\"$(printf '%b' \"$(xprop -id $1 "r" " \
+ "| sed -e 's/^"r"(UTF8_STRING) = \"\\(.*\\)\"/\\1/' " \
+ " -e 's/\\\\\\(.\\)/\\1/g' -e 's/\$//g'" \
+ " && cat " BM_FILE " " \
+ " && tail -100 " HS_FILE " | sort -r )\" " \
+ "| dmenu -b -l 20 -p '"p"' -w $1 | awk -F'|' '{if ($2 =="") print $1; else print $2}')\" " \
+ "&& xprop -id $1 -f "s" 8u -set "s" \"$prop\"", \
+ "surf-setprop", winid, NULL \
+ } \
+}
+#define SETPROP_DEFAULT(r, s, p) { \
+ .v = (const char *[]){ "/bin/sh", "-c", \
+ "prop=\"$(printf '%b' \"$(xprop -id $1 "r" " \
+ "| sed -e 's/^"r"(UTF8_STRING) = \"\\(.*\\)\"/\\1/' " \
+ " -e 's/\\\\\\(.\\)/\\1/g' -e 's/\$//g')\"" \
+ "| dmenu -b -p '"p"' -w $1 | awk '{print $NF}')\" " \
+ "&& xprop -id $1 -f "s" 8u -set "s" \"$prop\"", \
+ "surf-setprop", winid, NULL \
+ } \
+}
+
+/* DOWNLOAD(URI, referer) */
+#define DOWNLOAD(u, r) { \
+ .v = (const char *[]){ "st", "-c", "st-float", "-e", "/bin/sh", "-c",\
+ "cd ~/Downloads;" \
+ "curl -g -L -J -O -A \"$1\" -b \"$2\" -c \"$2\"" \
+ " -e \"$3\" \"$4\"; read", \
+ "surf-download", useragent, cookiefile, r, u, NULL \
+ } \
+}
+
+/* PLUMB(URI) */
+/* This called when some URI which does not begin with "about:",
+ * "http://" or "https://" should be opened.
+ */
+#define PLUMB(u) {\
+ .v = (const char *[]){ "/bin/sh", "-c", \
+ "xdg-open \"$0\"", u, NULL \
+ } \
+}
+
+/* VIDEOPLAY(URI) */
+#define VIDEOPLAY(u) {\
+ .v = (const char *[]){ "/bin/sh", "-c", \
+ "setsid -f open \"$0\"", u, NULL \
+ } \
+}
+
+/* BM_ADD(readprop) */
+#define BM_ADD(r) {\
+ .v = (const char *[]){ "/bin/sh", "-c", \
+ "(echo $(xprop -id $0 $1) | cut -d '\"' -f2 " \
+ "| sed 's/.*https*:\\/\\/\\(www\\.\\)\\?//' && cat ~/.config/surf/bookmarks) " \
+ "| awk '!seen[$0]++' > ~/.config/surf/bookmarks.tmp && " \
+ "mv ~/.config/surf/bookmarks.tmp ~/.config/surf/bookmarks", \
+ winid, r, NULL \
+ } \
+}
+
+/* styles */
+/*
+ * The iteration will stop at the first match, beginning at the beginning of
+ * the list.
+ */
+static SiteSpecific styles[] = {
+ /* regexp file in $styledir */
+ /*{ ".*", "default.css" },*/
+ { ".*startpage.com.*", "default.css" },
+ { ".*suckless.org.*", "default.css" },
+ { "about:.*", "default.css" },
+};
+
+/* certificates */
+/*
+ * Provide custom certificate for urls
+ */
+static SiteSpecific certs[] = {
+ /* regexp file in $certdir */
+ { "://suckless\\.org/", "suckless.org.crt" },
+};
+
+#define MODKEY GDK_CONTROL_MASK
+
+/* hotkeys */
+/*
+ * If you use anything else but MODKEY and GDK_SHIFT_MASK, don't forget to
+ * edit the CLEANMASK() macro.
+ */
+static Key keys[] = {
+ /* modifier keyval function arg */
+ { MODKEY, GDK_KEY_Return, spawn, SETPROP("_SURF_URI", "_SURF_GO", PROMPT_GO) },
+ { MODKEY, GDK_KEY_g, spawn, SETPROP_DEFAULT("_SURF_URI", "_SURF_GO", PROMPT_GO) },
+ { MODKEY, GDK_KEY_f, spawn, SETPROP_DEFAULT("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) },
+ { MODKEY, GDK_KEY_slash, spawn, SETPROP_DEFAULT("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) },
+ { MODKEY, GDK_KEY_m, spawn, BM_ADD("_SURF_URI") },
+
+ { MODKEY, GDK_KEY_w, playexternal, { 0 } },
+
+ { 0, GDK_KEY_Escape, stop, { 0 } },
+ { MODKEY, GDK_KEY_c, stop, { 0 } },
+
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_r, reload, { .i = 1 } },
+ { MODKEY, GDK_KEY_r, reload, { .i = 0 } },
+
+ { MODKEY, GDK_KEY_l, navigate, { .i = +1 } },
+ { MODKEY, GDK_KEY_h, navigate, { .i = -1 } },
+
+ /* vertical and horizontal scrolling, in viewport percentage */
+ { MODKEY, GDK_KEY_j, scrollv, { .i = +10 } },
+ { MODKEY, GDK_KEY_k, scrollv, { .i = -10 } },
+ { MODKEY, GDK_KEY_space, scrollv, { .i = +50 } },
+ { MODKEY, GDK_KEY_b, scrollv, { .i = -50 } },
+ { MODKEY, GDK_KEY_i, scrollh, { .i = +10 } },
+ { MODKEY, GDK_KEY_u, scrollh, { .i = -10 } },
+
+
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_j, zoom, { .i = -1 } },
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_k, zoom, { .i = +1 } },
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_q, zoom, { .i = 0 } },
+ { MODKEY, GDK_KEY_minus, zoom, { .i = -1 } },
+ { MODKEY, GDK_KEY_plus, zoom, { .i = +1 } },
+
+ { MODKEY, GDK_KEY_p, clipboard, { .i = 1 } },
+ { MODKEY, GDK_KEY_y, clipboard, { .i = 0 } },
+
+ { MODKEY, GDK_KEY_n, find, { .i = +1 } },
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_n, find, { .i = -1 } },
+
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_p, print, { 0 } },
+ { MODKEY, GDK_KEY_t, showcert, { 0 } },
+
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_a, togglecookiepolicy, { 0 } },
+ { 0, GDK_KEY_F11, togglefullscreen, { 0 } },
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_o, toggleinspector, { 0 } },
+
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_c, toggle, { .i = CaretBrowsing } },
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_f, toggle, { .i = FrameFlattening } },
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_g, toggle, { .i = Geolocation } },
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_s, toggle, { .i = JavaScript } },
+ { MODKEY|GDK_SHIFT_MASK, GDK_KEY_i, toggle, { .i = LoadImages } },
+ { 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 } },
+};
+
+/* button definitions */
+/* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */
+static Button buttons[] = {
+ /* target event mask button function argument stop event */
+ { OnLink, 0, 2, clicknewwindow, { .i = 0 }, 1 },
+ { OnLink, MODKEY, 2, clicknewwindow, { .i = 1 }, 1 },
+ { OnLink, MODKEY, 1, clicknewwindow, { .i = 1 }, 1 },
+ { OnAny, 0, 8, clicknavigate, { .i = -1 }, 1 },
+ { OnAny, 0, 9, clicknavigate, { .i = +1 }, 1 },
+ { OnMedia, MODKEY, 1, clickexternplayer, { 0 }, 1 },
+};
diff --git a/patches/surf-2.1-history.diff b/patches/surf-2.1-history.diff
@@ -0,0 +1,68 @@
+diff --git a/config.def.h b/config.def.h
+index b6ae4fc..74b1968 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 *historyfile = "~/.surf/history.txt";
++
+
+ /* Webkit default features */
+ /* Highest priority value will be used.
+diff --git a/surf.c b/surf.c
+index e709f35..d7c2166 100644
+--- a/surf.c
++++ b/surf.c
+@@ -347,9 +347,10 @@ setup(void)
+ curconfig = defconfig;
+
+ /* dirs and files */
+- cookiefile = buildfile(cookiefile);
+- scriptfile = buildfile(scriptfile);
+- certdir = buildpath(certdir);
++ cookiefile = buildfile(cookiefile);
++ historyfile = buildfile(historyfile);
++ scriptfile = buildfile(scriptfile);
++ certdir = buildpath(certdir);
+ if (curconfig[Ephemeral].val.i)
+ cachedir = NULL;
+ else
+@@ -589,6 +590,7 @@ loaduri(Client *c, const Arg *a)
+ } else {
+ webkit_web_view_load_uri(c->view, url);
+ updatetitle(c);
++ updatehistory(url);
+ }
+
+ g_free(url);
+@@ -659,6 +661,20 @@ updatetitle(Client *c)
+ }
+ }
+
++void
++updatehistory(const char *url)
++{
++ FILE *f;
++ f = fopen(historyfile, "a+");
++
++ char timestamp[20];
++ time_t now = time (0);
++ strftime (timestamp, 20, "%Y-%m-%dT%H:%M:%S", localtime (&now));
++
++ fprintf(f, "%s %s\n", timestamp, url);
++ fclose(f);
++}
++
+ void
+ gettogglestats(Client *c)
+ {
+@@ -1085,6 +1101,7 @@ cleanup(void)
+ close(spair[0]);
+ close(spair[1]);
+ g_free(cookiefile);
++ g_free(historyfile);
+ g_free(scriptfile);
+ g_free(stylefile);
+ g_free(cachedir);
diff --git a/patches/surf-bookmarks-20170722-723ff26.diff b/patches/surf-bookmarks-20170722-723ff26.diff
@@ -0,0 +1,42 @@
+diff --git a/config.def.h b/config.def.h
+index 2e735bf..43ad9ab 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -69,8 +69,9 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE |
+ #define SETPROP(r, s, p) { \
+ .v = (const char *[]){ "/bin/sh", "-c", \
+ "prop=\"$(printf '%b' \"$(xprop -id $1 $2 " \
+- "| sed \"s/^$2(STRING) = //;s/^\\\"\\(.*\\)\\\"$/\\1/\")\" " \
+- "| dmenu -p \"$4\" -w $1)\" && xprop -id $1 -f $3 8s -set $3 \"$prop\"", \
++ "| sed \"s/^$2(STRING) = //;s/^\\\"\\(.*\\)\\\"$/\\1/\" && cat ~/.surf/bookmarks)\" " \
++ "| dmenu -l 10 -p \"$4\" -w $1)\" && " \
++ "xprop -id $1 -f $3 8s -set $3 \"$prop\"", \
+ "surf-setprop", winid, r, s, p, NULL \
+ } \
+ }
+@@ -101,6 +102,17 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE |
+ } \
+ }
+
++/* BM_ADD(readprop) */
++#define BM_ADD(r) {\
++ .v = (const char *[]){ "/bin/sh", "-c", \
++ "(echo $(xprop -id $0 $1) | cut -d '\"' -f2 " \
++ "| sed 's/.*https*:\\/\\/\\(www\\.\\)\\?//' && cat ~/.surf/bookmarks) " \
++ "| awk '!seen[$0]++' > ~/.surf/bookmarks.tmp && " \
++ "mv ~/.surf/bookmarks.tmp ~/.surf/bookmarks", \
++ winid, r, NULL \
++ } \
++}
++
+ /* styles */
+ /*
+ * The iteration will stop at the first match, beginning at the beginning of
+@@ -132,6 +144,7 @@ static Key keys[] = {
+ { MODKEY, GDK_KEY_g, spawn, SETPROP("_SURF_URI", "_SURF_GO", PROMPT_GO) },
+ { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) },
+ { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) },
++ { MODKEY, GDK_KEY_m, spawn, BM_ADD("_SURF_URI") },
+
+ { 0, GDK_KEY_Escape, stop, { 0 } },
+ { MODKEY, GDK_KEY_c, stop, { 0 } },
diff --git a/patches/surf-clipboard-20200112-a6a8878.diff b/patches/surf-clipboard-20200112-a6a8878.diff
@@ -0,0 +1,67 @@
+From a6a8878bb6a203b589d559025b94a78214f22878 Mon Sep 17 00:00:00 2001
+From: Olivier Moreau <[email protected]>
+Date: Sun, 12 Jan 2020 11:23:11 +0000
+Subject: [PATCH] Added choice between PRIMARY and CLIPBOARD Gtk selections, as
+ a config option
+
+---
+ config.def.h | 1 +
+ surf.c | 11 +++++++++--
+ 2 files changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 34265f6..03bbe2b 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -48,6 +48,7 @@ static Parameter defconfig[ParameterLast] = {
+ [Style] = { { .i = 1 }, },
+ [WebGL] = { { .i = 0 }, },
+ [ZoomLevel] = { { .f = 1.0 }, },
++ [ClipboardNotPrimary] = { { .i = 1 }, },
+ };
+
+ static UriParameters uriparams[] = {
+diff --git a/surf.c b/surf.c
+index 2b54e3c..b8a9b2f 100644
+--- a/surf.c
++++ b/surf.c
+@@ -82,6 +82,7 @@ typedef enum {
+ Style,
+ WebGL,
+ ZoomLevel,
++ ClipboardNotPrimary,
+ ParameterLast
+ } ParamName;
+
+@@ -291,6 +292,7 @@ static ParamName loadcommitted[] = {
+ SpellLanguages,
+ Style,
+ ZoomLevel,
++ ClipboardNotPrimary,
+ ParameterLast
+ };
+
+@@ -1816,13 +1818,18 @@ showcert(Client *c, const Arg *a)
+ void
+ clipboard(Client *c, const Arg *a)
+ {
++ /* User defined choice of selection, see config.h */
++ GdkAtom selection = GDK_SELECTION_PRIMARY;
++ if (curconfig[ClipboardNotPrimary].val.i > 0)
++ selection = GDK_SELECTION_CLIPBOARD;
++
+ if (a->i) { /* load clipboard uri */
+ gtk_clipboard_request_text(gtk_clipboard_get(
+- GDK_SELECTION_PRIMARY),
++ selection),
+ pasteuri, c);
+ } else { /* copy uri */
+ gtk_clipboard_set_text(gtk_clipboard_get(
+- GDK_SELECTION_PRIMARY), c->targeturi
++ selection), c->targeturi
+ ? c->targeturi : geturi(c), -1);
+ }
+ }
+--
+2.24.1
+
diff --git a/patches/surf-playexternal-20190724-b814567.diff b/patches/surf-playexternal-20190724-b814567.diff
@@ -0,0 +1,54 @@
+From 95e17b5bd428173c83e60cec9cd5666cfe9066fa Mon Sep 17 00:00:00 2001
+From: DanMan <[email protected]>
+Date: Wed, 24 Jul 2019 18:47:46 -0400
+Subject: [PATCH] added playexternal hotkey function
+
+---
+ config.def.h | 2 ++
+ surf.c | 10 ++++++++++
+ 2 files changed, 12 insertions(+)
+
+diff --git a/config.def.h b/config.def.h
+index 6d3135e..5fa0d9d 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -105,6 +105,8 @@ static Key keys[] = {
+ { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") },
+ { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") },
+
++ { MODKEY, GDK_KEY_w, playexternal, { 0 } },
++
+ { 0, GDK_KEY_Escape, stop, { 0 } },
+ { MODKEY, GDK_KEY_c, stop, { 0 } },
+
+diff --git a/surf.c b/surf.c
+index 93a1629..e74e9df 100644
+--- a/surf.c
++++ b/surf.c
+@@ -217,6 +217,7 @@ static void togglefullscreen(Client *c, const Arg *a);
+ static void togglecookiepolicy(Client *c, const Arg *a);
+ static void toggleinspector(Client *c, const Arg *a);
+ static void find(Client *c, const Arg *a);
++static void playexternal(Client *c, const Arg *a);
+
+ /* Buttons */
+ static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h);
+@@ -1648,6 +1649,15 @@ clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h)
+ spawn(c, &arg);
+ }
+
++void
++playexternal(Client *c, const Arg *a)
++{
++ Arg arg;
++
++ arg = (Arg)VIDEOPLAY(geturi(c));
++ spawn(c, &arg);
++}
++
+ int
+ main(int argc, char *argv[])
+ {
+--
+2.22.0
+
diff --git a/surf-open.sh b/surf-open.sh
@@ -3,7 +3,7 @@
# See the LICENSE file for copyright and license details.
#
-xidfile="$HOME/tmp/tabbed-surf.xid"
+xidfile="/tmp/tabbed-surf.xid"
uri=""
if [ "$#" -gt 0 ];
@@ -29,4 +29,3 @@ else
surf -e "$xid" "$uri" >/dev/null 2>&1 &
fi
fi
-
diff --git a/surf.c b/surf.c
@@ -83,6 +83,7 @@ typedef enum {
Style,
WebGL,
ZoomLevel,
+ ClipboardNotPrimary,
ParameterLast
} ParamName;
@@ -177,6 +178,7 @@ static void spawn(Client *c, const Arg *a);
static void msgext(Client *c, char type, const Arg *a);
static void destroyclient(Client *c);
static void cleanup(void);
+static void updatehistory(const char *url, const char *title);
/* GTK/WebKit */
static WebKitWebView *newview(Client *c, WebKitWebView *rv);
@@ -233,6 +235,7 @@ static void togglefullscreen(Client *c, const Arg *a);
static void togglecookiepolicy(Client *c, const Arg *a);
static void toggleinspector(Client *c, const Arg *a);
static void find(Client *c, const Arg *a);
+static void playexternal(Client *c, const Arg *a);
/* Buttons */
static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h);
@@ -291,6 +294,7 @@ static ParamName loadcommitted[] = {
SpellLanguages,
Style,
ZoomLevel,
+ ClipboardNotPrimary,
ParameterLast
};
@@ -348,9 +352,10 @@ setup(void)
curconfig = defconfig;
/* dirs and files */
- cookiefile = buildfile(cookiefile);
- scriptfile = buildfile(scriptfile);
- certdir = buildpath(certdir);
+ cookiefile = buildfile(cookiefile);
+ historyfile = buildfile(historyfile);
+ scriptfile = buildfile(scriptfile);
+ certdir = buildpath(certdir);
if (curconfig[Ephemeral].val.i)
cachedir = NULL;
else
@@ -662,6 +667,20 @@ updatetitle(Client *c)
}
void
+updatehistory(const char *url, const char *title)
+{
+ FILE *f;
+ f = fopen(historyfile, "a+");
+
+ char timestamp[20];
+ time_t now = time (0);
+ strftime (timestamp, 20, "%Y-%m-%dT%H:%M:%S", localtime (&now));
+
+ fprintf(f, "%s|%s|%s\n", timestamp, url, title);
+ fclose(f);
+}
+
+void
gettogglestats(Client *c)
{
togglestats[0] = cookiepolicy_set(cookiepolicy_get());
@@ -1086,6 +1105,7 @@ cleanup(void)
close(spair[0]);
close(spair[1]);
g_free(cookiefile);
+ g_free(historyfile);
g_free(scriptfile);
g_free(stylefile);
g_free(cachedir);
@@ -1531,6 +1551,7 @@ loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c)
break;
case WEBKIT_LOAD_FINISHED:
seturiparameters(c, uri, loadfinished);
+ updatehistory(uri, c->title);
/* Disabled until we write some WebKitWebExtension for
* manipulating the DOM directly.
evalscript(c, "document.documentElement.style.overflow = '%s'",
@@ -1828,13 +1849,18 @@ showcert(Client *c, const Arg *a)
void
clipboard(Client *c, const Arg *a)
{
+ /* User defined choice of selection, see config.h */
+ GdkAtom selection = GDK_SELECTION_PRIMARY;
+ if (curconfig[ClipboardNotPrimary].val.i > 0)
+ selection = GDK_SELECTION_CLIPBOARD;
+
if (a->i) { /* load clipboard uri */
gtk_clipboard_request_text(gtk_clipboard_get(
- GDK_SELECTION_PRIMARY),
+ selection),
pasteuri, c);
} else { /* copy uri */
gtk_clipboard_set_text(gtk_clipboard_get(
- GDK_SELECTION_PRIMARY), c->targeturi
+ selection), c->targeturi
? c->targeturi : geturi(c), -1);
}
}
@@ -1986,6 +2012,15 @@ clickexternplayer(Client *c, const Arg *a, WebKitHitTestResult *h)
spawn(c, &arg);
}
+void
+playexternal(Client *c, const Arg *a)
+{
+ Arg arg;
+
+ arg = (Arg)VIDEOPLAY(geturi(c));
+ spawn(c, &arg);
+}
+
int
main(int argc, char *argv[])
{