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:
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) },
+