2024-08-02 18:34:24 +02:00
/* modifier 0 means no modifier */
2024-08-05 15:00:32 +02:00
static int surfuseragent = 1 ; /* Append Surf version to default WebKit user agent */
2024-08-02 18:34:24 +02:00
static char * fulluseragent = " " ; /* Or override the whole user agent string */
2024-08-05 18:13:05 +02:00
static char * scriptfile = " ~/.config/savoia/script.js " ;
static char * styledir = " ~/.config/savoia/styles/ " ;
static char * certdir = " ~/.config/savoia/certificates/ " ;
static char * dlstatus = " ~/.config/savoia/dlstatus/ " ;
2024-08-05 15:00:32 +02:00
static char * cachedir = " /tmp/cache " ;
static char * cookiefile = " /tmp/cookies.txt " ;
2024-08-05 15:34:58 +02:00
static char * dldir = " ~/dl/ " ;
2024-08-05 15:00:32 +02:00
static int tab_bar_height = 27 ;
static int tab_spacer_height = 4 ;
2024-08-06 01:00:47 +02:00
static const char * tab_bar_color [ ] = { " #222222 " , " #318d56 " , " #444444 " } ;
2024-08-05 15:00:32 +02:00
static int min_tab_fraction_size = 4 ; // 1/4th of the screen
2024-08-02 18:34:24 +02:00
static SearchEngine searchengines [ ] = {
2024-08-05 15:00:32 +02:00
{ " " , " https://web.penwing.org/search?q=%s " } ,
{ " - " , " https://searx.ox2.fr/search?q=%s " } ,
2024-08-02 18:34:24 +02:00
} ;
/* 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 ] = {
2024-08-05 15:00:32 +02:00
/* 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 } , } ,
2024-08-07 13:46:31 +02:00
[ DNSPrefetch ] = { { . i = 1 } , } ,
2024-08-05 15:00:32 +02:00
[ Ephemeral ] = { { . i = 0 } , } ,
[ FileURLsCrossAccess ] = { { . i = 0 } , } ,
[ FontSize ] = { { . i = 12 } , } ,
2024-08-07 13:46:31 +02:00
[ FrameFlattening ] = { { . i = 1 } , } ,
2024-08-05 15:00:32 +02:00
[ Geolocation ] = { { . i = 0 } , } ,
[ HideBackground ] = { { . i = 0 } , } ,
[ Inspector ] = { { . i = 0 } , } ,
2024-08-07 13:46:31 +02:00
[ Java ] = { { . i = 0 } , } ,
2024-08-05 15:00:32 +02:00
[ JavaScript ] = { { . i = 1 } , } ,
[ KioskMode ] = { { . i = 0 } , } ,
2024-08-07 13:46:31 +02:00
[ LoadImages ] = { { . i = 0 } , } ,
2024-08-05 15:00:32 +02:00
[ 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 } , } ,
2024-08-07 13:46:31 +02:00
[ ZoomLevel ] = { { . f = 1.1 } , } ,
2024-08-02 18:34:24 +02:00
} ;
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 |
2024-08-05 15:00:32 +02:00
WEBKIT_FIND_OPTIONS_WRAP_AROUND ;
2024-08-02 18:34:24 +02:00
# define PROMPT_GO "Go:"
# define PROMPT_FIND "Find:"
/* SETPROP(readprop, setprop, prompt)*/
# define SETPROP(r, s, p) { \
2024-08-05 15:00:32 +02:00
. v = ( const char * [ ] ) { " /bin/sh " , " -c " , \
" prop= \" $(printf '%b' \" $(xprop -id $1 " r " " \
" | sed -e 's/^ " r " (UTF8_STRING) = \" \\ (.* \\ ) \" / \\ 1/' " \
2024-08-07 13:46:31 +02:00
" -e 's/ \\ \\ \\ (. \\ )/ \\ 1/g' && cat ~/.config/savoia/bookmarks && echo 'keybinds') \" " \
2024-08-05 15:00:32 +02:00
" | marukuru -p ' " p " ' -w $1) \" " \
" && xprop -id $1 -f " s " 8u -set " s " \" $prop \" " , \
" surf-setprop " , winid , NULL \
} \
2024-08-02 18:34:24 +02:00
}
2024-08-05 15:34:58 +02:00
# define DLSTATUS { \
. v = ( const char * [ ] ) { " kodama " , " -e " , " /bin/sh " , " -c " , \
" while true; do cat $1/* 2>/dev/null || echo \" nothing to download \" ; " \
" A=; read A; " \
" if [ $A = \" clean \" ]; then rm $1/*; fi; clear; done " , \
" surf-dlstatus " , dlstatus , NULL \
} \
2024-08-02 18:34:24 +02:00
}
/* PLUMB(URI) */
/* This called when some URI which does not begin with "about:",
* " http:// " or " https:// " should be opened .
*/
# define PLUMB(u) {\
2024-08-07 13:46:31 +02:00
. v = ( const char * [ ] ) { " /bin/sh " , " -c " , \
" xdg-open \" $0 \" " , u , NULL \
} \
2024-08-02 18:34:24 +02:00
}
/* VIDEOPLAY(URI) */
# define VIDEOPLAY(u) {\
2024-08-07 13:46:31 +02:00
. v = ( const char * [ ] ) { " /bin/sh " , " -c " , \
" mpv --really-quiet \" $0 \" " , u , NULL \
} \
2024-08-05 15:00:32 +02:00
}
/* BM_ADD(readprop) */
# define BM_ADD(r) {\
2024-08-07 13:46:31 +02:00
. v = ( const char * [ ] ) { " /bin/sh " , " -c " , \
" (echo $(xprop -id $0 $1) | cut -d ' \" ' -f2 " \
" | sed 's/.*https*: \\ / \\ / \\ (www \\ . \\ ) \\ ?//' && cat ~/.config/savoia/bookmarks) " \
" | awk '!seen[$0]++' > ~/.config/savoia/bookmarks.tmp && " \
" mv ~/.config/savoia/bookmarks.tmp ~/.config/savoia/bookmarks && " \
" notify-send -u normal -a 'savoia' 'added bookmark' " , \
winid , r , NULL \
} \
2024-08-02 18:34:24 +02:00
}
/* styles */
/*
* The iteration will stop at the first match , beginning at the beginning of
* the list .
*/
static SiteSpecific styles [ ] = {
2024-08-05 15:00:32 +02:00
/* regexp file in $styledir */
{ " .* " , " default.css " } ,
2024-08-02 18:34:24 +02:00
} ;
/* certificates */
/*
* Provide custom certificate for urls
*/
static SiteSpecific certs [ ] = {
2024-08-05 15:00:32 +02:00
/* regexp file in $certdir */
2024-08-02 18:34:24 +02:00
{ " ://suckless \\ .org/ " , " suckless.org.crt " } ,
} ;
# define MODKEY GDK_CONTROL_MASK
/* hotkeys */
/*
2024-08-05 15:00:32 +02:00
* If you use anything else but MODKEY and GDK_SHIFT_MASK , dont forget to
2024-08-02 18:34:24 +02:00
* edit the CLEANMASK ( ) macro .
*/
static Key keys [ ] = {
2024-08-05 15:00:32 +02:00
/* modifier keyval function arg */
2024-08-06 01:25:22 +02:00
{ MODKEY , GDK_KEY_Return , spawn , SETPROP ( " _SURF_URI " , " _SURF_GO " , PROMPT_GO ) } ,
2024-08-05 15:00:32 +02:00
{ MODKEY , GDK_KEY_f , spawn , SETPROP ( " _SURF_FIND " , " _SURF_FIND " , PROMPT_FIND ) } ,
{ MODKEY , GDK_KEY_slash , spawn , SETPROP ( " _SURF_FIND " , " _SURF_FIND " , PROMPT_FIND ) } ,
2024-08-05 15:09:25 +02:00
{ MODKEY , GDK_KEY_b , spawn , BM_ADD ( " _SURF_URI " ) } ,
2024-08-05 15:34:58 +02:00
{ MODKEY , GDK_KEY_w , playexternal , { 0 } } ,
{ MODKEY , GDK_KEY_d , spawndls , { 0 } } ,
2024-08-07 13:46:31 +02:00
2024-08-05 15:00:32 +02:00
{ MODKEY , GDK_KEY_Left , switch_tab , { . i = - 1 } } ,
{ MODKEY , GDK_KEY_Right , switch_tab , { . i = + 1 } } ,
{ MODKEY | GDK_SHIFT_MASK , GDK_KEY_Left , move_tab , { . i = - 1 } } ,
{ MODKEY | GDK_SHIFT_MASK , GDK_KEY_Right , move_tab , { . i = + 1 } } ,
{ MODKEY | GDK_SHIFT_MASK , GDK_KEY_Down , close_tab , { . i = - 1 } } ,
{ MODKEY , GDK_KEY_Up , new_tab , { 0 } } ,
2024-08-07 13:46:31 +02:00
{ MODKEY , GDK_KEY_r , reload , { . i = 0 } } ,
{ MODKEY , GDK_KEY_i , insert , { . i = 1 } } ,
{ MODKEY , GDK_KEY_Escape , insert , { . i = 0 } } ,
/* vertical and horizontal scrolling, in viewport percentage */
// { MODKEY, GDK_KEY_k, scrollv, { .i = +30 } },
// { MODKEY, GDK_KEY_j, scrollv, { .i = -30 } },
// { MODKEY, GDK_KEY_l, scrollh, { .i = +30 } },
// { MODKEY, GDK_KEY_h, scrollh, { .i = -30 } },
{ MODKEY , GDK_KEY_equal , zoom , { . i = 0 } } ,
{ MODKEY , GDK_KEY_F4 , zoom , { . i = - 1 } } ,
{ MODKEY , GDK_KEY_F5 , zoom , { . i = + 1 } } ,
{ MODKEY , GDK_KEY_p , clipboard , { . i = 1 } } ,
{ MODKEY , GDK_KEY_y , clipboard , { . i = 0 } } ,
{ MODKEY , GDK_KEY_space , find , { . i = + 1 } } ,
{ MODKEY | GDK_SHIFT_MASK , GDK_KEY_space , find , { . i = - 1 } } ,
{ MODKEY | GDK_SHIFT_MASK , GDK_KEY_k , togglecookiepolicy , { 0 } } ,
{ MODKEY | GDK_SHIFT_MASK , GDK_KEY_i , toggleinspector , { 0 } } ,
{ MODKEY , GDK_KEY_F6 , toggle , { . i = Geolocation } } ,
{ MODKEY , GDK_KEY_F7 , toggle , { . i = CaretBrowsing } } ,
{ MODKEY , GDK_KEY_F8 , toggle , { . i = DarkMode } } ,
{ MODKEY , GDK_KEY_F9 , toggle , { . i = StrictTLS } } ,
{ MODKEY , GDK_KEY_F10 , toggle , { . i = LoadImages } } ,
{ MODKEY , GDK_KEY_F11 , toggle , { . i = FrameFlattening } } ,
{ MODKEY , GDK_KEY_F12 , toggle , { . i = JavaScript } } ,
//{ MODKEY, GDK_KEY_l, navigate, { .i = +1 } },
//{ MODKEY, GDK_KEY_h, navigate, { .i = -1 } },
//{ MODKEY|GDK_SHIFT_MASK, GDK_KEY_b, toggle, { .i = ScrollBars } },
//{ MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } },
2024-08-02 18:34:24 +02:00
} ;
/* button definitions */
/* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */
static Button buttons [ ] = {
2024-08-07 13:46:31 +02:00
/* target event mask button function argument stop event */
{ OnLink , 0 , 2 , clicknewtab , { . i = 0 } , 1 } ,
{ OnLink , MODKEY , 1 , clicknewtab , { . i = 0 } , 1 } ,
{ OnLink , MODKEY , 2 , clicknewwindow , { . i = 0 } , 1 } ,
{ OnLink , GDK_SHIFT_MASK , 1 , clickexternplayer , { 0 } , 1 } ,
{ OnAny , 0 , 8 , clicknavigate , { . i = - 1 } , 1 } ,
{ OnAny , 0 , 9 , clicknavigate , { . i = + 1 } , 1 } ,
2024-08-02 18:34:24 +02:00
} ;
2024-08-06 01:58:49 +02:00
const char * suspended_html = " <!DOCTYPE html><html lang= \" en \" ><head><meta charset= \" UTF-8 \" ><meta name= \" viewport \" content= \" width=device-width, initial-scale=1.0 \" ><title></title><style>body{background-color:#222;color:#444;display:flex;justify-content:center;align-items:center;height:100vh;margin:0;font-size:220px;}</style></head><body>⏾</body></html> " ;
2024-08-07 13:46:31 +02:00
const char * keybinds_url = " keybinds " ;
const char * keybinds_html = " <!DOCTYPE html><html lang= \" en \" ><head><meta charset= \" UTF-8 \" ><meta name= \" viewport \" content= \" width=device-width, initial-scale=1.0 \" ><title>Keybinds</title> "
" <style>body {background-color: #222;color: #aaa;height: 100vh;margin: 80px;font-size: 20px;}table {width: 100%;border-collapse: collapse;}th, td {padding: 10px;border: 1px solid #444;}th {background-color: #333;}td {background-color: #2a2a2a;}.section-header {background-color: #444;color: #fff;text-align: left;font-weight: bold;}</style></head> "
" <body><h2>Keybinds, all with Ctrl modifier</h2><table><tr><th>Keys</th><th>Action</th></tr><tr> "
" <td colspan= \" 2 \" class= \" section-header \" >Utilities</td></tr><tr><td>return</td><td>go to url</td></tr><tr><td>b</td><td>bookmark page</td></tr><tr><td>d</td><td>download manager</td></tr><tr><td>shift + i</td><td>inspector</td></tr><tr> "
" <td colspan= \" 2 \" class= \" section-header \" >Tab Management</td></tr><tr><td>⇆ </td><td>switch tabs</td></tr><tr><td>shift + ⇆ </td><td>move tabs</td></tr><tr><td>shift + ⬇ </td><td>close tab</td></tr><tr><td>⬆ </td><td>new tab</td></tr><tr><td>r</td><td>reload tab</td></tr><tr> "
" <td colspan= \" 2 \" class= \" section-header \" >Moving</td></tr><tr><td>f</td><td>find prompt</td></tr><tr><td>space</td><td>find next</td></tr><tr><td>shift + space</td><td>find previous</td></tr><tr><td>equal</td><td>reset zoom</td></tr><tr><td>F4</td><td>decrease zoom</td></tr><tr><td>F5</td><td>increase zoom</td></tr><tr> "
" <td colspan= \" 2 \" class= \" section-header \" >Toggles</td></tr><tr><td>F6</td><td>geolocation</td></tr><tr><td>F8</td><td>dark mode</td></tr><tr><td>F9</td><td>strict tls</td></tr><tr><td>F10</td><td>load images</td></tr><tr><td>F11</td><td>frame flattening</td></tr><tr><td>F12</td><td>javascript</td></tr></table> "
" <h2>Mousebinds</h2><table><tr><th>Trigger</th><th>Action</th></tr><tr> "
" <td colspan= \" 2 \" class= \" section-header \" >On links</td></tr><tr><td>middle click</td><td>open in new tab</td></tr><tr><td>ctrl + left click</td><td>open in new tab</td></tr><tr><td>ctrl + middle click</td><td>open in new window</td></tr><tr><td>shift + left click</td><td>open in mpv</td></tr></table></body></html> " ;