tMajor styles update. - surf - customized build of surf, the suckless webkit br… | |
git clone git://src.adamsgaard.dk/surf | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c2da2bae5dbca73f26fe77bb8080e2a90d3cbb1d | |
parent c467e5a3b3f3e1d69b64d31a166aa9d69336ef53 | |
Author: Christoph Lohmann <[email protected]> | |
Date: Sat, 17 Jan 2015 07:19:48 +0100 | |
Major styles update. | |
In config.h there is now some styles array to apply site-specific styles. | |
This can be toggled using the -mM flags. If a stylefile is manually specified, | |
tthen this will overwrite everything. | |
Diffstat: | |
M config.def.h | 9 ++++++++- | |
M surf.1 | 9 ++++++++- | |
M surf.c | 77 +++++++++++++++++++++++++++--… | |
3 files changed, 84 insertions(+), 11 deletions(-) | |
--- | |
diff --git a/config.def.h b/config.def.h | |
t@@ -2,8 +2,8 @@ | |
static char *useragent = "Mozilla/5.0 (X11; U; Unix; en-US) " | |
"AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 " | |
"Safari/537.15 Surf/"VERSION; | |
-static char *stylefile = "~/.surf/style.css"; | |
static char *scriptfile = "~/.surf/script.js"; | |
+static char *styledir = "~/.surf/styles/"; | |
static Bool kioskmode = FALSE; /* Ignore shortcuts */ | |
static Bool showindicators = TRUE; /* Show indicators in window title */ | |
t@@ -27,6 +27,7 @@ static Bool enablespatialbrowsing = TRUE; | |
static Bool enableplugins = TRUE; | |
static Bool enablescripts = TRUE; | |
static Bool enableinspector = TRUE; | |
+static Bool enablestyles = TRUE; | |
static Bool loadimages = TRUE; | |
static Bool hidebackground = FALSE; | |
static Bool allowgeolocation = TRUE; | |
t@@ -49,6 +50,12 @@ static Bool allowgeolocation = TRUE; | |
} \ | |
} | |
+/* styles */ | |
+static SiteStyle styles[] = { | |
+ /* regexp file in $styledir */ | |
+ { ".*", "default.css" }, | |
+}; | |
+ | |
#define MODKEY GDK_CONTROL_MASK | |
/* hotkeys */ | |
diff --git a/surf.1 b/surf.1 | |
t@@ -3,7 +3,7 @@ | |
surf \- simple webkit-based browser | |
.SH SYNOPSIS | |
.B surf | |
-.RB [-bBfFgGiIkKnNpPsSvx] | |
+.RB [-bBfFgGiIkKmMnNpPsSvx] | |
.RB [-a\ cookiepolicies] | |
.RB [-c\ cookiefile] | |
.RB [-e\ xid] | |
t@@ -68,6 +68,12 @@ Disable kiosk mode (disable key strokes and right click) | |
.B \-K | |
Enable kiosk mode (disable key strokes and right click) | |
.TP | |
+.B \-m | |
+Disable the site-specific styles. | |
+.TP | |
+.B \-M | |
+Enable the site-specific styles. | |
+.TP | |
.B \-n | |
Disable the Web Inspector (Developer Tools). | |
.TP | |
t@@ -93,6 +99,7 @@ Enable Javascript | |
.B \-t stylefile | |
Specify the user | |
.I stylefile. | |
+This does disable the site-specific styles. | |
.TP | |
.B \-u useragent | |
Specify the | |
diff --git a/surf.c b/surf.c | |
t@@ -23,6 +23,7 @@ | |
#include <sys/file.h> | |
#include <libgen.h> | |
#include <stdarg.h> | |
+#include <regex.h> | |
#include "arg.h" | |
t@@ -71,6 +72,12 @@ typedef struct { | |
G_DEFINE_TYPE(CookieJar, cookiejar, SOUP_TYPE_COOKIE_JAR_TEXT) | |
+typedef struct { | |
+ char *regex; | |
+ char *style; | |
+ regex_t re; | |
+} SiteStyle; | |
+ | |
static Display *dpy; | |
static Atom atoms[AtomLast]; | |
static Client *clients = NULL; | |
t@@ -82,6 +89,7 @@ static char togglestat[8]; | |
static char pagestat[3]; | |
static GTlsDatabase *tlsdb; | |
static int policysel = 0; | |
+static char *stylefile = NULL; | |
static void addaccelgroup(Client *c); | |
static void beforerequest(WebKitWebView *w, WebKitWebFrame *f, | |
t@@ -127,6 +135,8 @@ static const char *getatom(Client *c, int a); | |
static void gettogglestat(Client *c); | |
static void getpagestat(Client *c); | |
static char *geturi(Client *c); | |
+static gchar *getstyle(const char *uri); | |
+ | |
static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c); | |
static void inspector(Client *c, const Arg *arg); | |
t@@ -533,6 +543,19 @@ geturi(Client *c) { | |
return uri; | |
} | |
+static gchar * | |
+getstyle(const char *uri) { | |
+ int i; | |
+ | |
+ for(i = 0; i < LENGTH(styles); i++) { | |
+ if(styles[i].regex && !regexec(&(styles[i].re), uri, 0, | |
+ NULL, 0)) { | |
+ return g_strconcat("file://", styles[i].style, NULL); | |
+ } | |
+ } | |
+ return g_strdup(""); | |
+} | |
+ | |
static gboolean | |
initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) { | |
Arg arg; | |
t@@ -629,6 +652,7 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, C… | |
WebKitWebFrame *frame; | |
WebKitWebDataSource *src; | |
WebKitNetworkRequest *request; | |
+ WebKitWebSettings *set = webkit_web_view_get_settings(c->view); | |
SoupMessage *msg; | |
char *uri; | |
t@@ -644,6 +668,11 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, … | |
& SOUP_MESSAGE_CERTIFICATE_TRUSTED); | |
} | |
setatom(c, AtomUri, uri); | |
+ | |
+ if(stylefile == NULL && enablestyles) { | |
+ g_object_set(G_OBJECT(set), "user-stylesheet-uri", | |
+ getstyle(uri), NULL); | |
+ } | |
break; | |
case WEBKIT_LOAD_FINISHED: | |
c->progress = 100; | |
t@@ -702,7 +731,7 @@ newclient(void) { | |
GdkGeometry hints = { 1, 1 }; | |
GdkScreen *screen; | |
gdouble dpi; | |
- char *uri, *ua; | |
+ char *uri = NULL, *ua; | |
if(!(c = calloc(1, sizeof(Client)))) | |
die("Cannot malloc!\n"); | |
t@@ -832,8 +861,10 @@ newclient(void) { | |
if(!(ua = getenv("SURF_USERAGENT"))) | |
ua = useragent; | |
g_object_set(G_OBJECT(settings), "user-agent", ua, NULL); | |
- uri = g_strconcat("file://", stylefile, NULL); | |
- g_object_set(G_OBJECT(settings), "user-stylesheet-uri", uri, NULL); | |
+ if (stylefile != NULL) { | |
+ uri = g_strconcat("file://", stylefile, NULL); | |
+ g_object_set(G_OBJECT(settings), "user-stylesheet-uri", uri, N… | |
+ } | |
g_object_set(G_OBJECT(settings), "auto-load-images", loadimages, | |
NULL); | |
g_object_set(G_OBJECT(settings), "enable-plugins", enableplugins, | |
t@@ -888,7 +919,8 @@ newclient(void) { | |
fullscreen(c, NULL); | |
} | |
- g_free(uri); | |
+ if(stylefile != NULL) | |
+ g_free(uri); | |
setatom(c, AtomFind, ""); | |
setatom(c, AtomUri, "about:blank"); | |
t@@ -1094,6 +1126,7 @@ setatom(Client *c, int a, const char *v) { | |
static void | |
setup(void) { | |
+ int i; | |
char *proxy; | |
char *new_proxy; | |
SoupURI *puri; | |
t@@ -1114,7 +1147,23 @@ setup(void) { | |
/* dirs and files */ | |
cookiefile = buildpath(cookiefile); | |
scriptfile = buildpath(scriptfile); | |
- stylefile = buildpath(stylefile); | |
+ styledir = buildpath(styledir); | |
+ if(stylefile == NULL && enablestyles) { | |
+ for(i = 0; i < LENGTH(styles); i++) { | |
+ if(regcomp(&(styles[i].re), styles[i].regex, | |
+ REG_EXTENDED)) { | |
+ fprintf(stderr, | |
+ "Could not compile regex: %s\n", | |
+ styles[i].regex); | |
+ styles[i].regex = NULL; | |
+ } | |
+ styles[i].style = buildpath( | |
+ g_strconcat(styledir, | |
+ styles[i].style, NULL)); | |
+ } | |
+ } else { | |
+ stylefile = buildpath(stylefile); | |
+ } | |
/* request handler */ | |
s = webkit_get_default_session(); | |
t@@ -1282,12 +1331,16 @@ togglescrollbars(Client *c, const Arg *arg) { | |
static void | |
togglestyle(Client *c, const Arg *arg) { | |
- WebKitWebSettings *settings; | |
+ WebKitWebSettings *settings = webkit_web_view_get_settings(c->view); | |
char *uri; | |
- settings = webkit_web_view_get_settings(c->view); | |
g_object_get(G_OBJECT(settings), "user-stylesheet-uri", &uri, NULL); | |
- uri = uri[0] ? g_strdup("") : g_strconcat("file://", stylefile, NULL); | |
+ if(stylefile == NULL && enablestyles) { | |
+ uri = (uri && uri[0])? g_strdup("") : getstyle(geturi(c)); | |
+ } else { | |
+ uri = uri[0]? g_strdup("") : g_strconcat("file://", | |
+ stylefile, NULL); | |
+ } | |
g_object_set(G_OBJECT(settings), "user-stylesheet-uri", uri, NULL); | |
updatetitle(c); | |
t@@ -1318,7 +1371,7 @@ gettogglestat(Client *c){ | |
togglestat[p++] = value? 'V': 'v'; | |
g_object_get(G_OBJECT(settings), "user-stylesheet-uri", &uri, NULL); | |
- togglestat[p++] = uri[0] ? 'M': 'm'; | |
+ togglestat[p++] = (uri && uri[0]) ? 'M': 'm'; | |
togglestat[p] = '\0'; | |
} | |
t@@ -1451,6 +1504,12 @@ main(int argc, char *argv[]) { | |
case 'K': | |
kioskmode = 1; | |
break; | |
+ case 'm': | |
+ enablestyles = 0; | |
+ break; | |
+ case 'M': | |
+ enablestyles = 1; | |
+ break; | |
case 'n': | |
enableinspector = 0; | |
break; |