diff options
| author | twells46 <tom@wellsth.com> | 2026-01-25 15:17:01 -0600 |
|---|---|---|
| committer | twells46 <tom@wellsth.com> | 2026-01-25 15:17:01 -0600 |
| commit | a2b45396d4f368782a6600adc499c3a5b2734be8 (patch) | |
| tree | 2b2141f5b68b000f6339bce3a0a4447ea588d2db | |
| parent | 48517e586cdc98bc1af7115674b554cc70c8bc2e (diff) | |
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | compile_commands.json | 90 | ||||
| -rw-r--r-- | config.h | 204 | ||||
| -rw-r--r-- | config.mk | 2 | ||||
| -rw-r--r-- | surf.1 | 3 | ||||
| -rw-r--r-- | surf.c | 13 |
6 files changed, 312 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16d3c4d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.cache diff --git a/compile_commands.json b/compile_commands.json new file mode 100644 index 0000000..e8805c9 --- /dev/null +++ b/compile_commands.json @@ -0,0 +1,90 @@ +[ + { + "arguments": [ + "/usr/bin/cc", + "-std=c99", + "-fPIC", + "-pthread", + "-I/usr/include/gcr-3", + "-I/usr/include/gck-1", + "-I/usr/include/p11-kit-1", + "-I/usr/include/webkitgtk-4.1", + "-I/usr/include/gtk-3.0", + "-I/usr/include/at-spi2-atk/2.0", + "-I/usr/include/at-spi-2.0", + "-I/usr/include/dbus-1.0", + "-I/usr/lib64/dbus-1.0/include", + "-I/usr/include/gtk-3.0", + "-I/usr/include/gio-unix-2.0", + "-I/usr/include/pango-1.0", + "-I/usr/include/harfbuzz", + "-I/usr/include/pango-1.0", + "-I/usr/include/fribidi", + "-I/usr/include/harfbuzz", + "-I/usr/include/atk-1.0", + "-I/usr/include/cairo", + "-I/usr/include/freetype2", + "-I/usr/include/pixman-1", + "-I/usr/include/gdk-pixbuf-2.0", + "-I/usr/include/libpng16", + "-I/usr/include/webp", + "-I/usr/include/libsoup-3.0", + "-I/usr/include/libmount", + "-I/usr/include/blkid", + "-I/usr/include/webkitgtk-4.1", + "-I/usr/include/glib-2.0", + "-I/usr/lib64/glib-2.0/include", + "-DVERSION=\"2.1\"", + "-DGCR_API_SUBJECT_TO_CHANGE", + "-DLIBPREFIX=\"/usr/local/lib\"", + "-DWEBEXTDIR=\"/usr/local/lib/surf\"", + "-D_DEFAULT_SOURCE", + "-O2", + "-march=native", + "-O1", + "-c", + "surf.c" + ], + "directory": "/home/tom/.local/src/surf", + "file": "/home/tom/.local/src/surf/surf.c" + }, + { + "arguments": [ + "/usr/bin/cc", + "-std=c99", + "-fPIC", + "-pthread", + "-I/usr/include/webkitgtk-4.1", + "-I/usr/include/gtk-3.0", + "-I/usr/include/at-spi2-atk/2.0", + "-I/usr/include/at-spi-2.0", + "-I/usr/include/dbus-1.0", + "-I/usr/lib64/dbus-1.0/include", + "-I/usr/include/gtk-3.0", + "-I/usr/include/gio-unix-2.0", + "-I/usr/include/pango-1.0", + "-I/usr/include/harfbuzz", + "-I/usr/include/pango-1.0", + "-I/usr/include/fribidi", + "-I/usr/include/harfbuzz", + "-I/usr/include/atk-1.0", + "-I/usr/include/cairo", + "-I/usr/include/freetype2", + "-I/usr/include/pixman-1", + "-I/usr/include/gdk-pixbuf-2.0", + "-I/usr/include/libpng16", + "-I/usr/include/webp", + "-I/usr/include/libsoup-3.0", + "-I/usr/include/webkitgtk-4.1", + "-I/usr/include/libmount", + "-I/usr/include/blkid", + "-I/usr/include/glib-2.0", + "-I/usr/lib64/glib-2.0/include", + "-O1", + "-c", + "webext-surf.c" + ], + "directory": "/home/tom/.local/src/surf", + "file": "/home/tom/.local/src/surf/webext-surf.c" + } +] diff --git a/config.h b/config.h new file mode 100644 index 0000000..e9b4375 --- /dev/null +++ b/config.h @@ -0,0 +1,204 @@ +/* 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 = "~/.local/share/surf/certificates/"; +static char *cachedir = "~/.cache/surf"; +static char *cookiefile = "~/.local/share/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 = 0 }, }, + [DefaultCharset] = { { .v = "UTF-8" }, }, + [DiskCache] = { { .i = 1 }, }, + [DNSPrefetch] = { { .i = 0 }, }, + [Ephemeral] = { { .i = 0 }, }, + [FileURLsCrossAccess] = { { .i = 0 }, }, + [FontSize] = { { .i = 12 }, }, + [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 } }, }, + [Private] = { { .i = 0 }, }, + [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 \ + } \ +} + +#define BOOKMARK_CMD {\ + .v = (const char *[]){ "/bin/sh", "-c",\ + "surf-get-url $0 | save-bookmark", \ + winid, 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_KEY_m, spawn, BOOKMARK_CMD }, + + { 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 }, +}; @@ -25,7 +25,7 @@ LIBS = $(X11LIB) $(GTKLIB) -lgthread-2.0 CPPFLAGS = -DVERSION=\"$(VERSION)\" -DGCR_API_SUBJECT_TO_CHANGE \ -DLIBPREFIX=\"$(LIBPREFIX)\" -DWEBEXTDIR=\"$(LIBDIR)\" \ -D_DEFAULT_SOURCE -SURFCFLAGS = -fPIC $(INCS) $(CPPFLAGS) +SURFCFLAGS = -fPIC $(INCS) $(CPPFLAGS) -O2 -march=native WEBEXTCFLAGS = -fPIC $(WEBEXTINC) # compiler @@ -95,6 +95,9 @@ Enable the Web Inspector (Developer Tools). Specify the user .IR scriptfile . .TP +.B \-p +Enable private mode. +.TP .B \-s Disable Javascript. .TP @@ -73,6 +73,7 @@ typedef enum { MediaManualPlay, PDFJSviewer, PreferredLanguages, + Private, RunInFullscreen, ScrollBars, ShowIndicators, @@ -1088,6 +1089,12 @@ cleanup(void) while (clients) destroyclient(clients); + if (curconfig[Private].val.i) { + pid_t p = fork(); + if (!p) + execl("/usr/bin/rm", "/usr/bin/rm", "-r", "-f", "/tmp/surf", NULL); + } + close(spair[0]); close(spair[1]); g_free(cookiefile); @@ -2075,6 +2082,12 @@ main(int argc, char *argv[]) defconfig[Inspector].val.i = 1; defconfig[Inspector].prio = 2; break; + case 'p': + defconfig[Private].val.i = 1; + certdir = "/tmp/surf/certificates/"; + cachedir = "/tmp/surf/cache"; + cookiefile = "/tmp/surf/cookies.txt"; + break; case 'r': scriptfile = EARGF(usage()); break; |