X-Git-Url: https://git.danieliu.xyz/?p=surf.git;a=blobdiff_plain;f=surf.c;h=0f8b9c9174fdf122a058cd3652507796ea076a38;hp=06b7942f4a181bdef403fc81e2da7c9c50db7d45;hb=723ff26c3618cf4db1ae34688509cbcdfed1412f;hpb=d3e974f4eafe459990ff9b140d96a6fe568ee6dc diff --git a/surf.c b/surf.c index 06b7942..0f8b9c9 100644 --- a/surf.c +++ b/surf.c @@ -33,18 +33,6 @@ #define LENGTH(x) (sizeof(x) / sizeof(x[0])) #define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK)) -#define SETB(p, s) [p] = { { .b = s }, } -#define SETI(p, s) [p] = { { .i = s }, } -#define SETV(p, s) [p] = { { .v = s }, } -#define SETF(p, s) [p] = { { .f = s }, } -#define FSETB(p, s) [p] = { { .b = s }, 1 } -#define FSETI(p, s) [p] = { { .i = s }, 1 } -#define FSETV(p, s) [p] = { { .v = s }, 1 } -#define FSETF(p, s) [p] = { { .f = s }, 1 } -#define CSETB(p, s) [p] = (Parameter){ { .b = s }, 1 } -#define CSETI(p, s) [p] = (Parameter){ { .i = s }, 1 } -#define CSETV(p, s) [p] = (Parameter){ { .v = s }, 1 } -#define CSETF(p, s) [p] = (Parameter){ { .f = s }, 1 } enum { AtomFind, AtomGo, AtomUri, AtomLast }; @@ -103,7 +91,7 @@ typedef union { typedef struct { Arg val; - int force; + int prio; } Parameter; typedef struct Client { @@ -253,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[] = { @@ -384,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]; } } } @@ -686,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 @@ -730,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); @@ -1925,13 +1904,16 @@ main(int argc, char *argv[]) /* command line args */ ARGBEGIN { case 'a': - defconfig CSETV(CookiePolicies, EARGF(usage())); + defconfig[CookiePolicies].val.v = EARGF(usage()); + defconfig[CookiePolicies].prio = 2; break; case 'b': - defconfig CSETB(ScrollBars, 0); + defconfig[ScrollBars].val.i = 0; + defconfig[ScrollBars].prio = 2; break; case 'B': - defconfig CSETB(ScrollBars, 1); + defconfig[ScrollBars].val.i = 1; + defconfig[ScrollBars].prio = 2; break; case 'c': cookiefile = EARGF(usage()); @@ -1940,70 +1922,90 @@ main(int argc, char *argv[]) stylefile = EARGF(usage()); break; case 'd': - defconfig CSETB(DiskCache, 0); + defconfig[DiskCache].val.i = 0; + defconfig[DiskCache].prio = 2; break; case 'D': - defconfig CSETB(DiskCache, 1); + defconfig[DiskCache].val.i = 1; + defconfig[DiskCache].prio = 2; break; case 'e': embed = strtol(EARGF(usage()), NULL, 0); break; case 'f': - defconfig CSETB(RunInFullscreen, 0); + defconfig[RunInFullscreen].val.i = 0; + defconfig[RunInFullscreen].prio = 2; break; case 'F': - defconfig CSETB(RunInFullscreen, 1); + defconfig[RunInFullscreen].val.i = 1; + defconfig[RunInFullscreen].prio = 2; break; case 'g': - defconfig CSETB(Geolocation, 0); + defconfig[Geolocation].val.i = 0; + defconfig[Geolocation].prio = 2; break; case 'G': - defconfig CSETB(Geolocation, 1); + defconfig[Geolocation].val.i = 1; + defconfig[Geolocation].prio = 2; break; case 'i': - defconfig CSETB(LoadImages, 0); + defconfig[LoadImages].val.i = 0; + defconfig[LoadImages].prio = 2; break; case 'I': - defconfig CSETB(LoadImages, 1); + defconfig[LoadImages].val.i = 1; + defconfig[LoadImages].prio = 2; break; case 'k': - defconfig CSETB(KioskMode, 0); + defconfig[KioskMode].val.i = 0; + defconfig[KioskMode].prio = 2; break; case 'K': - defconfig CSETB(KioskMode, 1); + defconfig[KioskMode].val.i = 1; + defconfig[KioskMode].prio = 2; break; case 'm': - defconfig CSETB(Style, 0); + defconfig[Style].val.i = 0; + defconfig[Style].prio = 2; break; case 'M': - defconfig CSETB(Style, 1); + defconfig[Style].val.i = 1; + defconfig[Style].prio = 2; break; case 'n': - defconfig CSETB(Inspector, 0); + defconfig[Inspector].val.i = 0; + defconfig[Inspector].prio = 2; break; case 'N': - defconfig CSETB(Inspector, 1); + defconfig[Inspector].val.i = 1; + defconfig[Inspector].prio = 2; break; case 'p': - defconfig CSETB(Plugins, 0); + defconfig[Plugins].val.i = 0; + defconfig[Plugins].prio = 2; break; case 'P': - defconfig CSETB(Plugins, 1); + defconfig[Plugins].val.i = 1; + defconfig[Plugins].prio = 2; break; case 'r': scriptfile = EARGF(usage()); break; case 's': - defconfig CSETB(JavaScript, 0); + defconfig[JavaScript].val.i = 0; + defconfig[JavaScript].prio = 2; break; case 'S': - defconfig CSETB(JavaScript, 1); + defconfig[JavaScript].val.i = 1; + defconfig[JavaScript].prio = 2; break; case 't': - defconfig CSETB(StrictTLS, 0); + defconfig[StrictTLS].val.i = 0; + defconfig[StrictTLS].prio = 2; break; case 'T': - defconfig CSETB(StrictTLS, 1); + defconfig[StrictTLS].val.i = 1; + defconfig[StrictTLS].prio = 2; break; case 'u': fulluseragent = EARGF(usage()); @@ -2014,13 +2016,16 @@ main(int argc, char *argv[]) showxid = 1; break; case 'x': - defconfig CSETB(Certificate, 0); + defconfig[Certificate].val.i = 0; + defconfig[Certificate].prio = 2; break; case 'X': - defconfig CSETB(Certificate, 1); + defconfig[Certificate].val.i = 1; + defconfig[Certificate].prio = 2; break; case 'z': - defconfig CSETF(ZoomLevel, strtof(EARGF(usage()), NULL)); + defconfig[ZoomLevel].val.f = strtof(EARGF(usage()), NULL); + defconfig[ZoomLevel].prio = 2; break; default: usage();