surf

surf
git clone git@git.zachrice.app:repos/surf.git
Log | Files | Refs | README | LICENSE

commit 5447b5d61173843dcedb45c75b7fe7c43e252adf
parent 4fb4eeef6b2d6ec3fe7ab59c801f34ec9f834cbb
Author: Zach Rice <bynxmusic@gmail.com>
Date:   Mon, 18 May 2026 18:21:10 -0400

Ctrl+s now opens a dmenu prompt labeled 'Search:', sends query to DuckDuckGo. To use different engine, change SEARCH_URL defined in config.def.h

Diffstat:
Mconfig.def.h | 20++++++++++++++++++--
Apatches/surf-search.diff | 46++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -63,8 +63,23 @@ 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:" +#define PROMPT_GO "Go:" +#define PROMPT_FIND "Find:" +#define PROMPT_SEARCH "Search:" + +#define SEARCH_URL "https://duckduckgo.com/?q=" + +/* SEARCHPROP(prompt) — dmenu prompt, URL-encode input, navigate via _SURF_GO */ +#define SEARCHPROP(p) { \ + .v = (const char *[]){ "/bin/sh", "-c", \ + "prop=\"$(dmenu -p '"p"' -w $1 </dev/null" \ + " | sed 's/ /+/g')\"" \ + " && [ -n \"$prop\" ]" \ + " && xprop -id $1 -f _SURF_GO 8u -set _SURF_GO" \ + " \""SEARCH_URL"$prop\"", \ + "surf-search", winid, NULL \ + } \ +} /* SETPROP(readprop, setprop, prompt)*/ #define SETPROP(r, s, p) { \ @@ -144,6 +159,7 @@ 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_s, spawn, SEARCHPROP(PROMPT_SEARCH) }, { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, diff --git a/patches/surf-search.diff b/patches/surf-search.diff @@ -0,0 +1,46 @@ +Description: Add DuckDuckGo search via Ctrl+s with dmenu prompt +Adds a SEARCHPROP macro and Ctrl+s keybinding that opens a dmenu prompt +labeled "Search:", URL-encodes the query, and navigates to DuckDuckGo. +Change SEARCH_URL in config.def.h to use a different search engine. + +Apply: patch -p1 < patches/surf-search.diff +Unpatch: patch -R -p1 < patches/surf-search.diff + +diff --git a/config.def.h b/config.def.h +index d38966c..ea29f8c 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -63,8 +63,23 @@ 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:" ++#define PROMPT_GO "Go:" ++#define PROMPT_FIND "Find:" ++#define PROMPT_SEARCH "Search:" ++ ++#define SEARCH_URL "https://duckduckgo.com/?q=" ++ ++/* SEARCHPROP(prompt) — dmenu prompt, URL-encode input, navigate via _SURF_GO */ ++#define SEARCHPROP(p) { \ ++ .v = (const char *[]){ "/bin/sh", "-c", \ ++ "prop=\"$(dmenu -p '"p"' -w $1 </dev/null" \ ++ " | sed 's/ /+/g')\"" \ ++ " && [ -n \"$prop\" ]" \ ++ " && xprop -id $1 -f _SURF_GO 8u -set _SURF_GO" \ ++ " \""SEARCH_URL"$prop\"", \ ++ "surf-search", winid, NULL \ ++ } \ ++} + + /* SETPROP(readprop, setprop, prompt)*/ + #define SETPROP(r, s, p) { \ +@@ -144,6 +159,7 @@ 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_s, spawn, SEARCHPROP(PROMPT_SEARCH) }, + { MODKEY, GDK_KEY_f, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, + { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, +