#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 };
typedef struct {
Arg val;
- int force;
+ int prio;
} Parameter;
typedef struct Client {
}
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];
}
}
}
case Certificate:
case CookiePolicies:
case Style:
- config = defconfig[p].force ? defconfig :
- newconfig[p].force ? newconfig :
- defconfig;
+ config = (newconfig[p].prio > defconfig[p].prio) ?
+ newconfig : defconfig;
break;
default:
- if (defconfig[p].force)
+ if (newconfig[p].prio > defconfig[p].prio)
+ config = newconfig;
+ else if (curconfig[p].prio > defconfig[p].prio)
+ config = defconfig;
+ else
continue;
- config = newconfig[p].force ? newconfig :
- curconfig[p].force ? defconfig :
- NULL;
}
- if (config)
- setparameter(c, 0, p, &config[p].val);
+ setparameter(c, 0, p, &config[p].val);
}
curconfig = newconfig;
/* 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());
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());
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();