From b3ba9f59919c33d6a47aaa759f99aef61ee768a9 Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Sun, 5 Jan 2025 12:01:37 +0100 Subject: [PATCH 01/16] Request HTTPS by default instead of HTTP This might be more reasonable privacy-wise in 2025. --- surf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surf.c b/surf.c index 18d65d7..ec74aa8 100644 --- a/surf.c +++ b/surf.c @@ -579,7 +579,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 = g_strdup_printf("https://%s", uri); } if (apath != uri) free(apath); -- 2.54.0 From 7f1156f9b0977a72e523e031cf67a4946cfee9b2 Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Sat, 18 Nov 2023 12:38:09 +0100 Subject: [PATCH 02/16] Build against Webkit 4.1 Seems that this is needed for libsoup3. --- config.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config.mk b/config.mk index 2eb9fb0..544e123 100644 --- a/config.mk +++ b/config.mk @@ -12,10 +12,10 @@ LIBDIR = $(LIBPREFIX)/surf X11INC = `pkg-config --cflags x11` X11LIB = `pkg-config --libs x11` -GTKINC = `pkg-config --cflags gtk+-3.0 gcr-3 webkit2gtk-4.0` -GTKLIB = `pkg-config --libs gtk+-3.0 gcr-3 webkit2gtk-4.0` -WEBEXTINC = `pkg-config --cflags webkit2gtk-4.0 webkit2gtk-web-extension-4.0 gio-2.0` -WEBEXTLIBS = `pkg-config --libs webkit2gtk-4.0 webkit2gtk-web-extension-4.0 gio-2.0` +GTKINC = `pkg-config --cflags gtk+-3.0 gcr-3 webkit2gtk-4.1` +GTKLIB = `pkg-config --libs gtk+-3.0 gcr-3 webkit2gtk-4.1` +WEBEXTINC = `pkg-config --cflags webkit2gtk-4.1 webkit2gtk-web-extension-4.1 gio-2.0` +WEBEXTLIBS = `pkg-config --libs webkit2gtk-4.1 webkit2gtk-web-extension-4.1 gio-2.0` # includes and libs INCS = $(X11INC) $(GTKINC) -- 2.54.0 From c3b3b95f4a4b1c84ec6f320d51d31364186bb84b Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Mon, 26 Aug 2024 18:21:24 +0200 Subject: [PATCH 03/16] Fix some typo for kiosk mode in the man-page Thanks to Tim Dickson for spotting it! --- surf.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surf.1 b/surf.1 index 23117b1..5eb93fb 100644 --- a/surf.1 +++ b/surf.1 @@ -77,7 +77,7 @@ Enable Images. Disable kiosk mode (disable key strokes and right click). .TP .B \-K -Enable kiosk mode (disable key strokes and right click). +Enable kiosk mode (enable key strokes and right click). .TP .B \-m Disable application of user style sheets. -- 2.54.0 From 22cc5ceee2bb1e627457bbbdb4b80734bd25f4a4 Mon Sep 17 00:00:00 2001 From: Artyom Bologov Date: Sat, 14 Sep 2024 04:52:49 +0400 Subject: [PATCH 04/16] Support PDFs --- surf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/surf.c b/surf.c index ec74aa8..8b35a8f 100644 --- a/surf.c +++ b/surf.c @@ -1701,6 +1701,7 @@ decideresource(WebKitPolicyDecision *d, Client *c) && !g_str_has_prefix(uri, "webkit://") && !g_str_has_prefix(uri, "data:") && !g_str_has_prefix(uri, "blob:") + && !g_str_has_prefix(uri, "webkit-pdfjs-viewer://") && strlen(uri) > 0) { for (i = 0; i < strlen(uri); i++) { if (!g_ascii_isprint(uri[i])) { -- 2.54.0 From ca380ccb93dc204a33970c9025ddcc372fabf953 Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Fri, 18 Apr 2025 13:56:14 +0200 Subject: [PATCH 05/16] Add configuration option for PDF-JS-viewer --- config.def.h | 1 + surf.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index c5370b9..9b0f6f6 100644 --- a/config.def.h +++ b/config.def.h @@ -34,6 +34,7 @@ static Parameter defconfig[ParameterLast] = { [KioskMode] = { { .i = 0 }, }, [LoadImages] = { { .i = 1 }, }, [MediaManualPlay] = { { .i = 1 }, }, + [PDFJSviewer] = { { .i = 1 }, }, [PreferredLanguages] = { { .v = (char *[]){ NULL } }, }, [RunInFullscreen] = { { .i = 0 }, }, [ScrollBars] = { { .i = 1 }, }, diff --git a/surf.c b/surf.c index 8b35a8f..7a0f624 100644 --- a/surf.c +++ b/surf.c @@ -71,6 +71,7 @@ typedef enum { KioskMode, LoadImages, MediaManualPlay, + PDFJSviewer, PreferredLanguages, RunInFullscreen, ScrollBars, @@ -285,6 +286,7 @@ static ParamName loadcommitted[] = { Inspector, // KioskMode, MediaManualPlay, + PDFJSviewer, RunInFullscreen, ScrollBars, SiteQuirks, @@ -817,6 +819,8 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a) webkit_settings_set_media_playback_requires_user_gesture( c->settings, a->i); break; + case PDFJSviewer: + return; /* do nothing */ case PreferredLanguages: return; /* do nothing */ case RunInFullscreen: @@ -1701,7 +1705,7 @@ decideresource(WebKitPolicyDecision *d, Client *c) && !g_str_has_prefix(uri, "webkit://") && !g_str_has_prefix(uri, "data:") && !g_str_has_prefix(uri, "blob:") - && !g_str_has_prefix(uri, "webkit-pdfjs-viewer://") + && !(g_str_has_prefix(uri, "webkit-pdfjs-viewer://") && curconfig[PDFJSviewer].val.i) && strlen(uri) > 0) { for (i = 0; i < strlen(uri); i++) { if (!g_ascii_isprint(uri[i])) { -- 2.54.0 From 48517e586cdc98bc1af7115674b554cc70c8bc2e Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Sat, 19 Apr 2025 12:01:31 +0200 Subject: [PATCH 06/16] Fix (2) some typo for kiosk mode in the man-page Looks like I didn't pay enough attention the first time, that's what you get for pushing without review! Thanks to Hiltjo for spotting this! --- surf.1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/surf.1 b/surf.1 index 5eb93fb..c1a7744 100644 --- a/surf.1 +++ b/surf.1 @@ -74,10 +74,10 @@ Disable Images. Enable Images. .TP .B \-k -Disable kiosk mode (disable key strokes and right click). +Disable kiosk mode (enable key strokes and right click). .TP .B \-K -Enable kiosk mode (enable key strokes and right click). +Enable kiosk mode (disable key strokes and right click). .TP .B \-m Disable application of user style sheets. -- 2.54.0 From c185692a87395edf7dbc181520188a26bde065e7 Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Tue, 28 Apr 2026 21:45:38 -0400 Subject: [PATCH 07/16] flake --- .gitignore | 2 + config.h | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.lock | 27 ++++++++ flake.nix | 64 ++++++++++++++++++ 4 files changed, 287 insertions(+) create mode 100644 .gitignore create mode 100644 config.h create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17543c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.swp +/result diff --git a/config.h b/config.h new file mode 100644 index 0000000..e16a48b --- /dev/null +++ b/config.h @@ -0,0 +1,194 @@ +/* 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"; + +/* 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" }, }, + [DarkMode] = { { .i = 1 }, }, + [DefaultCharset] = { { .v = "UTF-8" }, }, + [DiskCache] = { { .i = 1 }, }, + [DNSPrefetch] = { { .i = 0 }, }, + [Ephemeral] = { { .i = 0 }, }, + [FileURLsCrossAccess] = { { .i = 0 }, }, + [FontSize] = { { .i = 16 }, }, + [Geolocation] = { { .i = 0 }, }, + [HideBackground] = { { .i = 0 }, }, + [Inspector] = { { .i = 0 }, }, + [JavaScript] = { { .i = 1 }, }, + [KioskMode] = { { .i = 0 }, }, + [LoadImages] = { { .i = 1 }, }, + [MediaManualPlay] = { { .i = 1 }, }, + [PDFJSviewer] = { { .i = 1 }, }, + [PreferredLanguages] = { { .v = (char *[]){ NULL } }, }, + [RunInFullscreen] = { { .i = 0 }, }, + [ScrollBars] = { { .i = 1 }, }, + [ShowIndicators] = { { .i = 1 }, }, + [SiteQuirks] = { { .i = 1 }, }, + [SmoothScrolling] = { { .i = 1 }, }, + [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_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 } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_d, toggle, { .i = DarkMode } }, +}; + +/* 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/flake.lock b/flake.lock new file mode 100644 index 0000000..bbfee60 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1777268161, + "narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1c3fe55ad329cbcb28471bb30f05c9827f724c76", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..ca80167 --- /dev/null +++ b/flake.nix @@ -0,0 +1,64 @@ +{ + description = "flake for surf"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + }; + + outputs = + { self, nixpkgs }: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { inherit system; }; + lib = pkgs.lib; + + in + { + packages.${system}.default = pkgs.stdenv.mkDerivation { + pname = "surf"; + version = "2.1"; + src = ./.; + + nativeBuildInputs = with pkgs; [ + pkg-config + wrapGAppsHook3 + ]; + buildInputs = with pkgs; [ + glib + gcr + glib-networking + gsettings-desktop-schemas + gtk3 + libsoup_3 + webkitgtk_4_1 + ] + ++ (with pkgs.gst_all_1; [ + # Audio & video support for webkitgtk WebView + gstreamer + gst-plugins-base + gst-plugins-good + gst-plugins-bad + ]); + + makeFlags = [ "PREFIX=$(out)" ]; + + # Add run-time dependencies to PATH. Append them to PATH so the user can + # override the dependencies with their own PATH. + preFixup = + let + depsPath = lib.makeBinPath (with pkgs; [ + xprop + dmenu + findutils + gnused + coreutils + ]); + in + '' + gappsWrapperArgs+=( + --suffix PATH : ${depsPath} + ) + ''; + }; + }; +} -- 2.54.0 From 9667df095041ac26a4df239ef1c199115ee9e015 Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Tue, 28 Apr 2026 22:47:59 -0400 Subject: [PATCH 08/16] use correct dirs --- config.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.h b/config.h index e16a48b..6cdee4b 100644 --- a/config.h +++ b/config.h @@ -3,9 +3,9 @@ static int surfuseragent = 1; /* Append Surf version to default WebKit user 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"; +static char *certdir = "~/.local/share/surf/certificates/"; +static char *cachedir = "~/.cache/surf/cache/"; +static char *cookiefile = "~/.local/share/surf/cookies.txt"; /* Webkit default features */ /* Highest priority value will be used. -- 2.54.0 From a0e80e730d4ac33f26eb7d4d6cb254e700b7e52b Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Tue, 28 Apr 2026 22:50:09 -0400 Subject: [PATCH 09/16] dns prefetch en --- config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.h b/config.h index 6cdee4b..a179efd 100644 --- a/config.h +++ b/config.h @@ -23,7 +23,7 @@ static Parameter defconfig[ParameterLast] = { [DarkMode] = { { .i = 1 }, }, [DefaultCharset] = { { .v = "UTF-8" }, }, [DiskCache] = { { .i = 1 }, }, - [DNSPrefetch] = { { .i = 0 }, }, + [DNSPrefetch] = { { .i = 1 }, }, [Ephemeral] = { { .i = 0 }, }, [FileURLsCrossAccess] = { { .i = 0 }, }, [FontSize] = { { .i = 16 }, }, -- 2.54.0 From 8f5ab7c9f5c5f20bb92e80481c73eb5e3cb974b9 Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Wed, 29 Apr 2026 00:19:08 -0400 Subject: [PATCH 10/16] bmarks and hist --- config.h | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/config.h b/config.h index a179efd..8eea15d 100644 --- a/config.h +++ b/config.h @@ -23,7 +23,7 @@ static Parameter defconfig[ParameterLast] = { [DarkMode] = { { .i = 1 }, }, [DefaultCharset] = { { .v = "UTF-8" }, }, [DiskCache] = { { .i = 1 }, }, - [DNSPrefetch] = { { .i = 1 }, }, + [DNSPrefetch] = { { .i = 0 }, }, [Ephemeral] = { { .i = 0 }, }, [FileURLsCrossAccess] = { { .i = 0 }, }, [FontSize] = { { .i = 16 }, }, @@ -64,18 +64,14 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | #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 \ - } \ +/* SETPROP(readprop, setprop)*/ +#define SETPROP(p, s) { \ + .v = (const char *[]){ "/bin/sh", "-c", \ + "surf.sh $1 $2 $3", "surf-sh", p, s, winid, NULL \ + } \ } + /* DOWNLOAD(URI, referer) */ #define DOWNLOAD(u, r) { \ .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\ @@ -130,9 +126,15 @@ static SiteSpecific certs[] = { */ 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) }, + { MODKEY, GDK_KEY_g, spawn, SETPROP("_SURF_URI", "_SURF_GO") }, + { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") }, + { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") }, + + /* bookmarks */ + { MODKEY, GDK_KEY_b, spawn, SETPROP("_SURF_BMARK", "_SURF_GO") }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_i, spawn, SETPROP("_SURF_INFO", "_SURF_GO") }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_g, spawn, SETPROP("_SURF_URI_RAW", "_SURF_GO") }, + { 0, GDK_KEY_Escape, stop, { 0 } }, { MODKEY, GDK_KEY_c, stop, { 0 } }, @@ -179,6 +181,8 @@ static Key keys[] = { { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t, toggle, { .i = StrictTLS } }, { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } }, { MODKEY|GDK_SHIFT_MASK, GDK_KEY_d, toggle, { .i = DarkMode } }, + + }; /* button definitions */ -- 2.54.0 From 94698f53e1eedd11150668fa8fc52ef2867cdd15 Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Wed, 29 Apr 2026 00:55:44 -0400 Subject: [PATCH 11/16] patch to avoid writing to readonly nix store script.js file --- surf.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/surf.c b/surf.c index 7a0f624..f9159a7 100644 --- a/surf.c +++ b/surf.c @@ -151,6 +151,7 @@ static void setup(void); static void sigchld(int unused); static void sighup(int unused); static char *buildfile(const char *path); +static char *buildfile2(const char *path); static char *buildpath(const char *path); static char *untildepath(const char *path); static const char *getuserhomedir(const char *user); @@ -353,7 +354,7 @@ setup(void) /* dirs and files */ cookiefile = buildfile(cookiefile); - scriptfile = buildfile(scriptfile); + scriptfile = buildfile2(scriptfile); certdir = buildpath(certdir); if (curconfig[Ephemeral].val.i) cachedir = NULL; @@ -400,7 +401,7 @@ setup(void) } g_free(styledir); } else { - stylefile = buildfile(stylefile); + stylefile = buildfile2(stylefile); } for (i = 0; i < LENGTH(uriparams); ++i) { @@ -464,6 +465,31 @@ buildfile(const char *path) return fpath; } +char * +buildfile2(const char *path) +{ + char *dname, *bname, *bpath, *fpath; + FILE *f; + + dname = g_path_get_dirname(path); + bname = g_path_get_basename(path); + + bpath = buildpath(dname); + g_free(dname); + + fpath = g_build_filename(bpath, bname, NULL); + g_free(bpath); + g_free(bname); + + if (!(f = fopen(fpath, "r"))) + die("Could not open file: %s\n", fpath); + + fclose(f); + + return fpath; +} + + static const char* getuserhomedir(const char *user) { -- 2.54.0 From 2d34cbd5fef906b62798c4cfa8bb27e6dcdf0d59 Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Wed, 29 Apr 2026 01:14:19 -0400 Subject: [PATCH 12/16] add inspector --- config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.h b/config.h index 8eea15d..b45ffff 100644 --- a/config.h +++ b/config.h @@ -29,7 +29,7 @@ static Parameter defconfig[ParameterLast] = { [FontSize] = { { .i = 16 }, }, [Geolocation] = { { .i = 0 }, }, [HideBackground] = { { .i = 0 }, }, - [Inspector] = { { .i = 0 }, }, + [Inspector] = { { .i = 1 }, }, [JavaScript] = { { .i = 1 }, }, [KioskMode] = { { .i = 0 }, }, [LoadImages] = { { .i = 1 }, }, -- 2.54.0 From e83b7c93f4f45bec608251b3b28273d6d3c2ab53 Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Wed, 29 Apr 2026 01:38:52 -0400 Subject: [PATCH 13/16] use C+/ for find --- config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.h b/config.h index b45ffff..b8ede9a 100644 --- a/config.h +++ b/config.h @@ -127,7 +127,7 @@ static SiteSpecific certs[] = { static Key keys[] = { /* modifier keyval function arg */ { MODKEY, GDK_KEY_g, spawn, SETPROP("_SURF_URI", "_SURF_GO") }, - { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") }, + /*{ MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") },*/ { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") }, /* bookmarks */ -- 2.54.0 From 8d7fa98e2089a622231333e7766472b039afdd5e Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Mon, 4 May 2026 18:23:51 -0400 Subject: [PATCH 14/16] update config.def.h --- config.def.h | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/config.def.h b/config.def.h index 9b0f6f6..b8ede9a 100644 --- a/config.def.h +++ b/config.def.h @@ -1,11 +1,11 @@ /* 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"; +static char *scriptfile = "~/.config/surf/script.js"; +static char *styledir = "~/.config/surf/styles/"; +static char *certdir = "~/.local/share/surf/certificates/"; +static char *cachedir = "~/.cache/surf/cache/"; +static char *cookiefile = "~/.local/share/surf/cookies.txt"; /* Webkit default features */ /* Highest priority value will be used. @@ -20,16 +20,16 @@ static Parameter defconfig[ParameterLast] = { [Certificate] = { { .i = 0 }, }, [CaretBrowsing] = { { .i = 0 }, }, [CookiePolicies] = { { .v = "@Aa" }, }, - [DarkMode] = { { .i = 0 }, }, + [DarkMode] = { { .i = 1 }, }, [DefaultCharset] = { { .v = "UTF-8" }, }, [DiskCache] = { { .i = 1 }, }, [DNSPrefetch] = { { .i = 0 }, }, [Ephemeral] = { { .i = 0 }, }, [FileURLsCrossAccess] = { { .i = 0 }, }, - [FontSize] = { { .i = 12 }, }, + [FontSize] = { { .i = 16 }, }, [Geolocation] = { { .i = 0 }, }, [HideBackground] = { { .i = 0 }, }, - [Inspector] = { { .i = 0 }, }, + [Inspector] = { { .i = 1 }, }, [JavaScript] = { { .i = 1 }, }, [KioskMode] = { { .i = 0 }, }, [LoadImages] = { { .i = 1 }, }, @@ -40,7 +40,7 @@ static Parameter defconfig[ParameterLast] = { [ScrollBars] = { { .i = 1 }, }, [ShowIndicators] = { { .i = 1 }, }, [SiteQuirks] = { { .i = 1 }, }, - [SmoothScrolling] = { { .i = 0 }, }, + [SmoothScrolling] = { { .i = 1 }, }, [SpellChecking] = { { .i = 0 }, }, [SpellLanguages] = { { .v = ((char *[]){ "en_US", NULL }) }, }, [StrictTLS] = { { .i = 1 }, }, @@ -64,18 +64,14 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | #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 \ - } \ +/* SETPROP(readprop, setprop)*/ +#define SETPROP(p, s) { \ + .v = (const char *[]){ "/bin/sh", "-c", \ + "surf.sh $1 $2 $3", "surf-sh", p, s, winid, NULL \ + } \ } + /* DOWNLOAD(URI, referer) */ #define DOWNLOAD(u, r) { \ .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\ @@ -130,9 +126,15 @@ static SiteSpecific certs[] = { */ 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) }, + { MODKEY, GDK_KEY_g, spawn, SETPROP("_SURF_URI", "_SURF_GO") }, + /*{ MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") },*/ + { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND") }, + + /* bookmarks */ + { MODKEY, GDK_KEY_b, spawn, SETPROP("_SURF_BMARK", "_SURF_GO") }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_i, spawn, SETPROP("_SURF_INFO", "_SURF_GO") }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_g, spawn, SETPROP("_SURF_URI_RAW", "_SURF_GO") }, + { 0, GDK_KEY_Escape, stop, { 0 } }, { MODKEY, GDK_KEY_c, stop, { 0 } }, @@ -179,6 +181,8 @@ static Key keys[] = { { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t, toggle, { .i = StrictTLS } }, { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } }, { MODKEY|GDK_SHIFT_MASK, GDK_KEY_d, toggle, { .i = DarkMode } }, + + }; /* button definitions */ -- 2.54.0 From 4c185985ff3dfa91a18a9b568cec66c159bb7980 Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Mon, 4 May 2026 18:24:34 -0400 Subject: [PATCH 15/16] rename shell script to surf_search --- config.def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index b8ede9a..7df6638 100644 --- a/config.def.h +++ b/config.def.h @@ -67,7 +67,7 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | /* SETPROP(readprop, setprop)*/ #define SETPROP(p, s) { \ .v = (const char *[]){ "/bin/sh", "-c", \ - "surf.sh $1 $2 $3", "surf-sh", p, s, winid, NULL \ + "surf_search $1 $2 $3", "surf_search", p, s, winid, NULL \ } \ } -- 2.54.0 From a9203494a3895f95a0207dabf7c587e60dab45c8 Mon Sep 17 00:00:00 2001 From: Skullheadx Date: Mon, 4 May 2026 18:27:19 -0400 Subject: [PATCH 16/16] update config --- config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.h b/config.h index b8ede9a..7df6638 100644 --- a/config.h +++ b/config.h @@ -67,7 +67,7 @@ static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | /* SETPROP(readprop, setprop)*/ #define SETPROP(p, s) { \ .v = (const char *[]){ "/bin/sh", "-c", \ - "surf.sh $1 $2 $3", "surf-sh", p, s, winid, NULL \ + "surf_search $1 $2 $3", "surf_search", p, s, winid, NULL \ } \ } -- 2.54.0