X-Git-Url: https://git.danieliu.xyz/?p=surf.git;a=blobdiff_plain;f=surf.c;h=0f8b9c9174fdf122a058cd3652507796ea076a38;hp=5ba6e514b925f8d972813be921b6a46e4aacf3c3;hb=723ff26c3618cf4db1ae34688509cbcdfed1412f;hpb=a0ef4ba41d3e43618607f9cf1d14e83ee475f624 diff --git a/surf.c b/surf.c index 5ba6e51..0f8b9c9 100644 --- a/surf.c +++ b/surf.c @@ -91,7 +91,7 @@ typedef union { typedef struct { Arg val; - int force; + int prio; } Parameter; typedef struct Client { @@ -241,6 +241,7 @@ static GdkDevice *gdkkb; static char *stylefile; static const char *useragent; static Parameter *curconfig; +static int modparams[ParameterLast]; char *argv0; static ParamName loadtransient[] = { @@ -372,19 +373,18 @@ setup(void) } for (i = 0; i < LENGTH(uriparams); ++i) { - if (!regcomp(&(uriparams[i].re), uriparams[i].uri, + if (regcomp(&(uriparams[i].re), uriparams[i].uri, REG_EXTENDED)) { - /* copy default parameters if they are not already set - * or if they are forced */ - for (j = 0; j < ParameterLast; ++j) { - if (!uriparams[i].config[j].force || - defconfig[j].force) - uriparams[i].config[j] = defconfig[j]; - } - } else { fprintf(stderr, "Could not compile regex: %s\n", uriparams[i].uri); uriparams[i].uri = NULL; + continue; + } + + /* copy default parameters with higher priority */ + for (j = 0; j < ParameterLast; ++j) { + if (defconfig[j].prio >= uriparams[i].config[j].prio) + uriparams[i].config[j] = defconfig[j]; } } } @@ -674,42 +674,31 @@ cookiepolicy_set(const WebKitCookieAcceptPolicy p) void seturiparameters(Client *c, const char *uri, ParamName *params) { - Parameter *config, *newconfig = NULL; + Parameter *config, *uriconfig = NULL; int i, p; for (i = 0; i < LENGTH(uriparams); ++i) { if (uriparams[i].uri && !regexec(&(uriparams[i].re), uri, 0, NULL, 0)) { - newconfig = uriparams[i].config; + uriconfig = uriparams[i].config; break; } } - if (!newconfig) - newconfig = defconfig; + curconfig = uriconfig ? uriconfig : defconfig; for (i = 0; (p = params[i]) != ParameterLast; ++i) { switch(p) { + default: /* FALLTHROUGH */ + if (!(defconfig[p].prio < curconfig[p].prio || + defconfig[p].prio < modparams[p])) + continue; case Certificate: case CookiePolicies: case Style: - config = defconfig[p].force ? defconfig : - newconfig[p].force ? newconfig : - defconfig; - break; - default: - if (defconfig[p].force) - continue; - config = newconfig[p].force ? newconfig : - curconfig[p].force ? defconfig : - NULL; + setparameter(c, 0, p, &curconfig[p].val); } - - if (config) - setparameter(c, 0, p, &config[p].val); } - - curconfig = newconfig; } void @@ -718,6 +707,8 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a) GdkRGBA bgcolor = { 0 }; WebKitSettings *s = webkit_web_view_get_settings(c->view); + modparams[p] = curconfig[p].prio; + switch (p) { case AcceleratedCanvas: webkit_settings_set_enable_accelerated_2d_canvas(s, a->i); @@ -1914,15 +1905,15 @@ main(int argc, char *argv[]) ARGBEGIN { case 'a': defconfig[CookiePolicies].val.v = EARGF(usage()); - defconfig[CookiePolicies].force = 1; + defconfig[CookiePolicies].prio = 2; break; case 'b': defconfig[ScrollBars].val.i = 0; - defconfig[ScrollBars].force = 1; + defconfig[ScrollBars].prio = 2; break; case 'B': defconfig[ScrollBars].val.i = 1; - defconfig[ScrollBars].force = 1; + defconfig[ScrollBars].prio = 2; break; case 'c': cookiefile = EARGF(usage()); @@ -1932,89 +1923,89 @@ main(int argc, char *argv[]) break; case 'd': defconfig[DiskCache].val.i = 0; - defconfig[DiskCache].force = 1; + defconfig[DiskCache].prio = 2; break; case 'D': defconfig[DiskCache].val.i = 1; - defconfig[DiskCache].force = 1; + defconfig[DiskCache].prio = 2; break; case 'e': embed = strtol(EARGF(usage()), NULL, 0); break; case 'f': defconfig[RunInFullscreen].val.i = 0; - defconfig[RunInFullscreen].force = 1; + defconfig[RunInFullscreen].prio = 2; break; case 'F': defconfig[RunInFullscreen].val.i = 1; - defconfig[RunInFullscreen].force = 1; + defconfig[RunInFullscreen].prio = 2; break; case 'g': defconfig[Geolocation].val.i = 0; - defconfig[Geolocation].force = 1; + defconfig[Geolocation].prio = 2; break; case 'G': defconfig[Geolocation].val.i = 1; - defconfig[Geolocation].force = 1; + defconfig[Geolocation].prio = 2; break; case 'i': defconfig[LoadImages].val.i = 0; - defconfig[LoadImages].force = 1; + defconfig[LoadImages].prio = 2; break; case 'I': defconfig[LoadImages].val.i = 1; - defconfig[LoadImages].force = 1; + defconfig[LoadImages].prio = 2; break; case 'k': defconfig[KioskMode].val.i = 0; - defconfig[KioskMode].force = 1; + defconfig[KioskMode].prio = 2; break; case 'K': defconfig[KioskMode].val.i = 1; - defconfig[KioskMode].force = 1; + defconfig[KioskMode].prio = 2; break; case 'm': defconfig[Style].val.i = 0; - defconfig[Style].force = 1; + defconfig[Style].prio = 2; break; case 'M': defconfig[Style].val.i = 1; - defconfig[Style].force = 1; + defconfig[Style].prio = 2; break; case 'n': defconfig[Inspector].val.i = 0; - defconfig[Inspector].force = 1; + defconfig[Inspector].prio = 2; break; case 'N': defconfig[Inspector].val.i = 1; - defconfig[Inspector].force = 1; + defconfig[Inspector].prio = 2; break; case 'p': defconfig[Plugins].val.i = 0; - defconfig[Plugins].force = 1; + defconfig[Plugins].prio = 2; break; case 'P': defconfig[Plugins].val.i = 1; - defconfig[Plugins].force = 1; + defconfig[Plugins].prio = 2; break; case 'r': scriptfile = EARGF(usage()); break; case 's': defconfig[JavaScript].val.i = 0; - defconfig[JavaScript].force = 1; + defconfig[JavaScript].prio = 2; break; case 'S': defconfig[JavaScript].val.i = 1; - defconfig[JavaScript].force = 1; + defconfig[JavaScript].prio = 2; break; case 't': defconfig[StrictTLS].val.i = 0; - defconfig[StrictTLS].force = 1; + defconfig[StrictTLS].prio = 2; break; case 'T': defconfig[StrictTLS].val.i = 1; - defconfig[StrictTLS].force = 1; + defconfig[StrictTLS].prio = 2; break; case 'u': fulluseragent = EARGF(usage()); @@ -2026,15 +2017,15 @@ main(int argc, char *argv[]) break; case 'x': defconfig[Certificate].val.i = 0; - defconfig[Certificate].force = 1; + defconfig[Certificate].prio = 2; break; case 'X': defconfig[Certificate].val.i = 1; - defconfig[Certificate].force = 1; + defconfig[Certificate].prio = 2; break; case 'z': defconfig[ZoomLevel].val.f = strtof(EARGF(usage()), NULL); - defconfig[ZoomLevel].force = 1; + defconfig[ZoomLevel].prio = 2; break; default: usage();